LNK2019: symbole externe non résolu

J'ai vu plein d'autres questions comme ça, mais je ne pouvais pas comprendre ce problème avec l'aide d'entre eux. J'ai bien compris que c'est un problème de liaison, mais de ce que je peux voir, j'ai le lien redressé.

Je suis en train d'écrire un chat client/serveur (avec l'aide de cet article).

J'ai défini une classe afin de conserver les fonctions de serveur et avoir un en-tête de fichier qui gère l'ensemble de la comprend.

C'est le fichier d'en-tête:

#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <tchar.h>
#include <strsafe.h>
#include "resource1.h"


class ChatServer
{
    public: int InitServer(HINSTANCE hInst);

    public: void ReportError(int errorCode, const char *whichFunc);
};

C'est le serveur réel "classe":

#include "server.h"
#define NETWORK_ERROR -1
#define NETWORK_OK     0
//Keeps stuff for the server    
int ChatServer::InitServer(HINSTANCE hInst)
{
WORD sockVersion;
WSADATA wsaData;
int nret;
sockVersion = MAKEWORD(1,1); //Version 1.1
//Init winsock
WSAStartup(sockVersion, &wsaData);
//Create listening socket
SOCKET listeningSocket;
//AFINET - Go over TCP
//SOCK_STREAM - Stream oriented socket
//IPPROTO_TCP - Use tcp rather than udp
listeningSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listeningSocket == INVALID_SOCKET)
{
nret = WSAGetLastError(); //Get error detail
ReportError(nret, "socket()");
WSACleanup();
return NETWORK_ERROR;
}
SOCKADDR_IN serverInfo;
serverInfo.sin_family = AF_INET;
serverInfo.sin_addr.s_addr = INADDR_ANY;
serverInfo.sin_port = htons(1337); 
//Bind the socket to local server address.
nret = bind(listeningSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr));
if(nret == SOCKET_ERROR)
{
nret = WSAGetLastError();
ReportError(nret, "bind()");
WSACleanup();
return NETWORK_ERROR;
}
//Make socket listen
nret = listen(listeningSocket, 10); //Up to 10 connections at the same time.
if(nret = SOCKET_ERROR)
{
nret = WSAGetLastError();
ReportError(nret, "listen()");
WSACleanup();
return NETWORK_ERROR;
}
//Wait for client
SOCKET theClient;
theClient = accept(listeningSocket, NULL, NULL);
if(theClient == INVALID_SOCKET)
{
nret = WSAGetLastError();
ReportError(nret, "accept()");
WSACleanup();
return NETWORK_ERROR;
}
//Send and receive from the client, and finally,
closesocket(theClient);
closesocket(listeningSocket);
//shutdown
WSACleanup();
return NETWORK_OK;
}
void ChatServer::ReportError(int errorCode, const char *whichFunc)
{
char errorMsg[92];                   //Declare a buffer to hold
//the generated error message
ZeroMemory(errorMsg, 92);            //Automatically NULL-terminate the string
//The following line copies the phrase, whichFunc string, and integer errorCode into the buffer
sprintf(errorMsg, "Call to %s returned error %d!", (char *)whichFunc, errorCode);
MessageBox(NULL, errorMsg, "socketIndication", MB_OK);
}

Et enfin, la main.cpp fichier avec l'entrée-méthode pour le programme appelle "ChatServer::InitServer(g_hInst)". Il est assez grand donc j'ai omis, mais si c'est nécessaire, je vais le poster aussi.

Les messages d'erreur que j'obtiens sont comme celui-ci, mais ils ont tous l'état des problèmes avec l'api des fonctions liées à la winsockets API:

Error   3   error LNK2019: unresolved external symbol _closesocket@4 referenced in function "public: int __thiscall ChatServer::InitServer(struct HINSTANCE__ *)" (?InitServer@ChatServer@@QAEHPAUHINSTANCE__@@@Z)  

Comme je l'ai dit avant, je crois que ce problème a quelque chose à voir avec le compilateur malentendu que faire avec des fonctions comme "closesocket" qui devrait être liée à winsock.h.

Merci pour tout conseil à tous et merci pour la lecture de tout ce charabia 🙂

Pourquoi n'êtes-vous pas à l'aide de winsock2.h?
avez-vous un lien avec wininet.lib et ws2_32.lib ?
Vous n'avez pas besoin de mettre public en face de chaque membre de la déclaration de la fonction. Une fois que vous une liste d'accès spécificateur de tout ce qui s'ensuit ont le même accès jusqu'à ce que vous liste un spécificateur d'accès différents.
C'est en fait une combinaison de ce que Drahakar et stinj dire ci-dessus. Faire #include<winsock2.h> comme le premier fichier d'en-tête à inclure (avant Windows.h, qui winsock2.h comprend de toute façon). Puis ajouter ws2_32.lib à vos bibliothèques de liens à partir des paramètres du projet. Praetorian est le droit aussi à propos de "public".
vous devriez avoir répondu à cela, j'ai fait ce que vous avez dit et se débarrasser de l'erreur. Merci.

OriginalL'auteur Phil | 2011-08-29