c++ - 未解析的外部符号 receiveThread(这是 _beginthread 的入口点)

标签 c++ sockets udp

我正在尝试为我正在制作的游戏建立一个 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/

相关文章:

c++ - 插入在 Unordered_map (C++) 中花费很长时间,以 ULONG 为键且桶数未知

node.js - 让socket和http服务器监听同一个端口

c - 为什么这个阻塞套接字读取返回零并且没有错误?

qt - 如何通过 QT 中的特定网络接口(interface)写入数据报?

iis - 在生产环境中使端口范围从 1024 到 65535 是否安全

c++ - 返回对私有(private) vector 成员元素的非 const 引用是不好的做法吗?

c++ - 在哪里可以找到一些深入的 DirectX 11 教程?

php - 基于 C++ 代码在 PHP 中创建字节数据并将其传递到套接字

python - 在 python 中使用 udp 客户端接收来自 127.0.0.1 的响应时出现问题

c++ - 为什么资源管理顺序很重要?