我正在尝试为正在制作的游戏使用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/