c++ - boost::thread 构建错误(无法链接 lib && 未解析的外部)

标签 c++ boost multithreading visual-studio-2008-sp1

我正在尝试在 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/

相关文章:

c++ - 从具有未知参数计数的函数创建仿函数

c - 将多个参数传递给 pthread_create

pthreads 和 curl 之间的 PHP 测试

c++ - "class _LIBCPP_TEMPLATE_VIS vector"中宏_LIBCPP_TEMPLATE_VIS的用法是什么

c++ - 从结构 vector 创建无序映射

c++ - 子类化后编辑控件无法获得焦点或设置文本

c++ - Boost 在序列化过程中丢失了一些数据

c++ - 使用 Protocol Buffer 连接 C# 和 C++

c++ - 使用 boost::regex 时如何指定回车符和换行符匹配?

c - 下面的代码创建了多少线程,为什么?