未解析的外部符号接收线程(这是_beginthread的入口点)

Unresolved External Symbol receiveThread (that's the entry point for _beginthread)

本文关键字:这是 beginthread 入口 外部 符号 线程      更新时间:2023-10-16

我正在尝试为我正在制作的游戏提供 UDP 连接,套接字的输入通过第二个线程读取,因此游戏可以在等待消息时继续运行。我让它在一个单独的项目中工作,但是当将其移植到我的游戏代码时,我收到一个未解析的外部符号错误:

LNK2019:未解析的外部符号"void __cdecl receiveThread(void *)"(?receiveThread@@YAXPAX@Z)在函数"public: bool __thiscall Network::setupServerUDP(void)"(?setupServerUDP@Network@@QAE_NXZ)中引用。

我已经用谷歌搜索了一下,每个人都说运行时库应该设置为多线程,我做到了(在 MVS 2010 中,我认为甚至不可能将其设置为单线程),但它不能解决错误。我敢肯定,这只是一些愚蠢的选项,在某处设置了错误的东西。但我就是想不出它是什么。

我已经

包含了ws2tcpip.h,并且我已经链接到正确的库:#pragma 注释(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期望使用标准调用函数,而不是 cdecl。使用_beginthreadex,您不必担心约定。

错误告诉您

链接器找不到函数的实现 receiveThread我猜是在ws2tcpip.h中声明

如果Ws2_32.lib包含实现,请尝试将其添加到项目属性菜单下的链接器->其他依赖项->输入(假设你使用的是 Visual Studio)。