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


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


我已经在Google上进行了搜索,每个人都说应将Runtime Library设置为Multi-threaded(在MVS 2010中,我认为甚至不可能将其设置为单线程),但是它不能解决错误。 。
我敢肯定,这只是在某些地方设置了错误选项的一些愚蠢选项。但是我只是想不出它是什么。

我包含了ws2tcpip.h,并且已链接到正确的库:#pragma comment(lib,“ Ws2_32.lib”)。

我的测试项目和游戏项目之间的唯一区别是,该测试项目是一个Console应用程序,另一个是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/

10-10 16:09