我正在尝试在 VS 2008 中学习 Boost::Thread(版本 1.4-3)的简单教程:
#include <boost/thread/thread.hpp>
void Func()
{
// Do something
}
void main()
{
boost::thread _thrd(&Func);
_thrd.join();
....
}
在编译过程中会产生这个错误:
Error 1 fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-gd-1_43.lib' CConsole
我必须通过添加 #define BOOST_ALL_NO_LIB
来解决这个问题。
但是,它给了我另一个错误:
Error 3 fatal error LNK1120: 2 unresolved externals
C:\xx\Documents\Visual Studio 2008\Projects\CConsole\Debug\CConsole.exe
Error 1 error LNK2019: unresolved external symbol "public: __thiscall boost::thread::~thread(void)" (??1thread@boost@@QAE@XZ) referenced in function _wmain CConsole.obj
Error 2 error LNK2019: unresolved external symbol "private: void __thiscall boost::thread::start_thread(void)" (?start_thread@thread@boost@@AAEXXZ) referenced in function "public: __thiscall boost::thread::thread<void (__cdecl*)(void)>(void (__cdecl*)(void),struct boost::thread::dummy *)" (??$?0P6AXXZ@thread@boost@@QAE@P6AXXZPAUdummy@01@@Z) CConsole.obj
有谁知道如何解决这个问题?
谢谢。
最佳答案
我认为比“阅读 F*cking 手册”更深入的答案可能会有所帮助!
这种链接错误表明您正在尝试链接不兼容的 Boost 库。
当我错误地构建了一个 32 位的 Boost 线程库时,我以为我正在构建一个 64 位的库,我得到了这个。花了一段时间才弄清楚,当您说 --address-model=64
作为 bjam 命令行参数时,您犯了一个微妙的错误。 address-model
参数不能有 --
前缀。遗憾的是,bjam 在发现语法错误时不会通知您。
您可以使用 dumpbin 程序来检查您的库提供的符号,以及链接器所说的未解析的符号。我发现库符号是用 __thiscall
而不是 __cdecl
装饰的。这是架构不匹配的一个非常好的线索。 Microsoft 编译器对 32 位构建使用 __thiscall
函数调用协议(protocol),但对 64 位构建使用 __cdecl
。是的,这里的 Microsoft 文档有点薄弱!!
检查 .lib 或 .dll 以查看其构建方式的最佳方法是使用 dumpbin 程序。这是一个例子:
dumpbin /headers libboost_thread-vc100-mt-gd-1_45.lib | findstr machine
当然,您必须调整库名称以适合您要链接的内容。这将明确告诉您 .lib 或 .dll 是针对 x86(32 位)还是针对 x64(64 位)。
关于c++ - boost::thread 构建错误(无法链接 lib && 未解析的外部),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164268/