0

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

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

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

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

我的测试项目和游戏项目之间的唯一区别是测试项目是控制台应用程序,另一个是 Windows 应用程序,但我不明白为什么会有任何问题。想法?

谢谢你的帮助!

干杯,

格言

4

2 回答 2

1

未解决的函数不是_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,您不必担心约定。

于 2012-07-03T15:09:32.473 回答
0

该错误告诉您链接器找不到receiveThread我猜想在 ws2tcpip.h 中声明的函数的实现

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

于 2012-07-03T15:10:32.070 回答