gpt4 book ai didi

c++ - LNK2019 : Unresolved external symbol

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:10 25 4
gpt4 key购买 nike

我见过很多其他类似的问题,但在他们的帮助下我无法解决这个问题。我知道这是一个链接问题,但据我所知,我已经理清了链接问题。

我正在编写一个聊天服务器/客户端(在 this article 的帮助下)。

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

这是头文件:

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

这是实际的服务器“类”:

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

}

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

我收到的错误消息如下所示,但它们都说明了与 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)  

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

感谢您的任何建议,感谢您阅读所有这些胡言乱语:)

最佳答案

这些链接器错误总是相同的:您正在使用链接器无法找到的符号。您需要告诉链接器链接到包含这些符号的库。

As I stated before, I believe this problem has something to do with the compiler misunderstanding what to do with functions like "closesocket" that should be linked to winsock.h.

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

不过,您可能应该使用 winsock2.h 而不是 winsock.h。 Windows Sockets API 2.0 始于 1994 年,版本 1 早已过时。

你可以在this function's documentation的底部看到它所在的库是 ws2_32.lib。

关于c++ - LNK2019 : Unresolved external symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com