Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::线程生成错误(无法链接库和未解析的外部)_C++_Boost_Multithreading_Visual Studio 2008 Sp1 - Fatal编程技术网

C++ boost::线程生成错误(无法链接库和未解析的外部)

C++ boost::线程生成错误(无法链接库和未解析的外部),c++,boost,multithreading,visual-studio-2008-sp1,C++,Boost,Multithreading,Visual Studio 2008 Sp1,我正试图遵循VS2008中Boost::Thread(1.4-3版)的简单教程: #include <boost/thread/thread.hpp> void Func() { // Do something } void main() { boost::thread _thrd(&Func); _thrd.join(); .... } 我必须通过添加#define BOOST\u ALL\u NO\u LIB来解决这个问题。 但是,它

我正试图遵循VS2008中Boost::Thread(1.4-3版)的简单教程:

#include <boost/thread/thread.hpp>

void Func()
{
    // Do something
}

void main()
{
    boost::thread _thrd(&Func);
    _thrd.join();
    ....
}
我必须通过添加
#define BOOST\u ALL\u NO\u 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
错误3致命错误LNK1120:2个未解析的外部
C:\xx\Documents\Visual Studio 2008\Projects\CConsole\Debug\CConsole.exe
错误1错误LNK2019:未解析的外部符号“public:u thiscall boost::thread::~thread(void)”(??1thread@boost@@QAE@XZ)在函数_wmaincconsole.obj中引用
错误2错误LNK2019:未解析的外部符号“private:void\uu thiscall boost::thread::start\u thread(void)”(?start_thread@thread@boost@@AAEXXZ)在函数“public:\uu thiscall boost::thread::thread(void(\uu cdecl*)(void),struct boost::thread::dummy*)”中引用(??$?0P6AXXZ@thread@促进@@QAE@P6AXXZPAUdummy@01@@Z)CConsole.obj
有人知道如何解决这个问题吗


谢谢。

您需要构建Boost线程库,并告诉Visual Studio库在哪里。所有这些都记录在入门文档(即)中。具体阅读然后


另外,您需要确保您的构建配置与您的VS设置相匹配。《入门》解释了各种构建选项。

我认为一个比“阅读该死的手册”更深刻的答案可能会有所帮助

这种链接错误是您试图链接不兼容的Boost库的线索

当我以为我在构建一个64位的库时,我错误地构建了一个32位的Boost线程库。花了一段时间才发现,当您将
--address model=64
作为bjam命令行参数时,您犯了一个微妙的错误。
地址模型
参数不能有
--
前缀。不幸的是,当bjam看到错误的语法时,它不会通知您

您可以使用dumpbin程序检查库提供的符号,而不是链接器所说的未解析的符号。我发现库符号是用
\uuuu thiscall
装饰的,而不是
\uuuu cdecl
。这是架构不匹配的一个很好的线索。Microsoft编译器对32位版本使用
\uuuu thiscall
函数调用协议,但对64位版本使用
\uuu cdecl
。是的,这里的Microsoft文档有点弱

检查.lib或.dll以查看其构建方式的最佳方法是使用dumpbin程序。下面是一个例子:

dumpbin /headers libboost_thread-vc100-mt-gd-1_45.lib | findstr machine

当然,您必须调整库名称以适应所链接的内容。这将清楚地告诉您.lib或.dll是针对x86(32位)还是针对x64(64位)。

并非Boost的所有部分都是标题。您需要包含适当的cpp文件(不推荐)或(通常更好)构建一个静态库,您可以将项目链接到该库。您好,Bundy472,我确实链接了lib文件,但是我注意到文件名有点不同,因此我重命名了该文件,它似乎可以工作。谢谢。库的名称会根据您构建的库的类型而变化:静态/动态、调试/发布、单线程/多线程。。。。您不应更改名称,但应使用参数为bjam builder构建所需的正确库。我认为,如果使用“Visual Studio 2005 x64 Win64命令提示符”编译boost,我将拥有64位boost库。然后我不断地遇到这种链接错误。花了很多时间在谷歌上搜索才找到这个答案。谢谢
\b2 address model=64 stage
这些问题还源于boost默认情况下对所有lib使用相同的目录,并且不会根据体系结构更改文件名。通过这种方式,您可以轻松地用i64库覆盖x86库,反之亦然。
dumpbin /headers libboost_thread-vc100-mt-gd-1_45.lib | findstr machine