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 🙂
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
Vous devez vous connecter pour publier un commentaire.
Ces erreurs d'édition de liens sont toujours les mêmes: vous êtes en utilisant un symbole que le linker ne trouve pas. Vous devez dire à l'éditeur de liens pour créer un lien avec les bibliothèques qui contiennent ces symboles.
Non,
closesocket
est pas lié à winsock.h. winsock.h est un fichier d'en-tête, pas une bibliothèque. Il peut contenir une déclaration declosesocket
et c'est ok pour le compilateur, mais l'éditeur de liens vraiment besoin de savoir où le code de cette fonction est de sorte qu'il peut lier votre programme.Vous devriez probablement utiliser des winsock2.h au lieu de winsock.h, si. L'API Windows Sockets 2.0 date de 1994, et la version 1 est longue obsolètes.
Vous pouvez voir au bas de cette fonction documentation que la bibliothèque, où il réside est ws2_32.lib.
OriginalL'auteur R. Martinho Fernandes
Votre classe peut être définie comme suit:
Cependant vous êtes erreur est causée par ne pas y compris la bibliothèque d'entrée. Sur votre projet de ligne d'entrée d'ajouter la dépendance sur la bibliothèque winsock également envisager l'utilisation de winsock2.h.
Pour référence: http://msdn.microsoft.com/en-us/library/ms737629(v=vs. 85).aspx
OriginalL'auteur AJG85
Juste notamment les .h fichier ne provoque pas le code qui implémente les fonctions liées dans. L' .h fichier indique au compilateur que les fonctions existent quelque part, et ce qui leur signature. Vous avez encore à faire de la bibliothèque où la fonction est effectivement mis en œuvre la disposition de l'éditeur de liens.
OriginalL'auteur Rob K