我正在尝试为我正在制作的游戏建立一个 UDP 连接,套接字的输入是通过第二个线程读取的,因此游戏可以在等待消息时继续运行。我让它在一个单独的项目中工作,但是当把它移植到我的游戏代码时,我得到一个未解析的外部符号错误:
LNK2019: unresolved external symbol "void __cdecl receiveThread(void *)" (?receiveThread@@YAXPAX@Z) referenced in function "public: bool __thiscall Network::setupServerUDP(void)" (?setupServerUDP@Network@@QAE_NXZ)).
我用谷歌搜索了一下,每个人都说应该将运行时库设置为多线程,我也这样做了(在 MVS 2010 中,我认为甚至不可能将其设置为单线程)但事实并非如此解决错误。 我敢肯定这只是某个愚蠢的选项在某处设置了错误的东西。但我只是想不出它是什么。
我包含了 ws2tcpip.h 并且链接到了正确的库:#pragma comment(lib, "Ws2_32.lib")。
我的测试项目和游戏项目之间的唯一区别是测试项目是一个控制台应用程序,另一个是 Windows 应用程序,但我不明白为什么这应该是任何问题。想法?
感谢您的帮助!
干杯,
格言
最佳答案
未解析的函数不是_beginthread
,而是receiveThread
。这就是您的函数 - 您作为参数提供给 _beginthread
的线程入口点。您是否使用正确的调用约定编写了该函数?真的是cdecl
吗?如果您将其声明为 cdecl 但在没有显式调用约定的情况下实现,则会导致这样的链接错误。例如,此代码会导致链接错误:
extern "C" { void receiveThread(void*); } //There's a cdecl function somewhere
//...
_beginthread(receiveThread, 0, 0); //Let's refer to it
//...
void receiveThread(void *p) //But this is not it! It's stdcall.
{
//Do something
}
要解决此问题,请确保您的 receiveThread
实现使用 cdecl 约定或声明为 extern "C"
。
郑重声明,_beginthreadex
需要一个 stdcall 函数,而不是 cdecl。使用 _beginthreadex
,您不必担心约定。
关于c++ - 未解析的外部符号 receiveThread(这是 _beginthread 的入口点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11313471/