LNK2019:未解析的外部符号

Phi*_*hil 4 c++ winapi winsock

我已经看到了很多其他类似的问题,但我无法在他们的帮助下解决这个问题.我知道这是一个链接问题,但从我所看到的,我已经把连接理顺了.

我正在写一个聊天服务器/客户端(在本文的帮助下).

我已经定义了一个类来保存服务器函数,并有一个处理所有包含的头文件.

这是头文件:

#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);
};
Run Code Online (Sandbox Code Playgroud)

这是实际的服务器"类":

#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);

    }
Run Code Online (Sandbox Code Playgroud)

最后,带有程序入口方法的main.cpp文件调用"ChatServer :: InitServer(g_hInst)".它很大,所以我省略了它,但是如果它需要我也会发布它.

我得到的错误消息如下所示,但它们都表明与winsockets API相关的api函数存在问题:

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

正如我之前所说的,我认为这个问题与编译器误解如何处理应该链接到winsock.h的"closesocket"等功能有关.

感谢任何建议,感谢阅读所有这些乱码:)

R. *_*des 9

这些链接器错误始终相同:您使用链接器无法找到的符号.您需要告诉链接器链接包含这些符号的库.

正如我之前所说的,我认为这个问题与编译器误解如何处理应该链接到winsock.h的"closesocket"等功能有关.

不,closesocket没有链接到winsock.h.winsock.h是头文件,而不是库.它可能包含一个声明,closesocket并且对编译器来说没问题,但链接器确实需要知道该函数的代码在哪里,以便它可以将程序链接到它.

但是你可能应该使用winsock2.h而不是winsock.h.Windows Sockets API 2.0的历史可以追溯到1994年,版本1已经过时了.

您可以在此函数的文档底部看到它所在的库是ws2_32.lib.