尝试链接 Boost 1.52 线程
Posted
技术标签:
【中文标题】尝试链接 Boost 1.52 线程【英文标题】:Trying to link Boost 1.52 thread 【发布时间】:2013-01-18 10:08:35 【问题描述】:我正在尝试编译我的程序,但它根本不会链接。我已经指定了 boost lib 文件的路径,但链接器仍然抱怨。这是我得到的链接错误:
1>Edproj.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" (?system_category@system@boost@@YAABVerror_category@12@XZ)
1>Edproj.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (?generic_category@system@boost@@YAABVerror_category@12@XZ)
1>Edproj.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall boost::detail::thread_data_base::~thread_data_base(void)" (??1thread_data_base@detail@boost@@UAE@XZ)
1>Edproj.obj : error LNK2001: unresolved external symbol "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXABVexception@std@@@Z)
1>Edproj.obj : error LNK2001: unresolved external symbol "public: void __thiscall boost::thread::detach(void)" (?detach@thread@boost@@QAEXXZ)
1>Edproj.obj : error LNK2001: unresolved external symbol "public: void __thiscall boost::thread::join(void)" (?join@thread@boost@@QAEXXZ)
1>Edproj.obj : error LNK2001: unresolved external symbol "private: void __thiscall boost::thread::start_thread(void)" (?start_thread@thread@boost@@AAEXXZ)
1>Edproj.obj : error LNK2001: unresolved external symbol "bool __cdecl boost::this_thread::interruptible_wait(void *,struct boost::detail::timeout)" (?interruptible_wait@this_thread@boost@@YA_NPAXUtimeout@detail@2@@Z)
BOOST_LIB_DIAGNOSTIC 返回
1> Linking to lib file: libboost_thread-vc100-mt-s-1_52.lib
1> Linking to lib file: libboost_date_time-vc100-mt-s-1_52.lib
1> Linking to lib file: libboost_system-vc100-mt-s-1_52.lib
1> Linking to lib file: libboost_chrono-vc100-mt-s-1_52.lib
更多信息:
我正在运行 64 位 Windows 8 Pro,并使用以下选项编译了 boost
bjam --build-type=complete --toolset=msvc10.0 address-model=64 architecture=x86 variant=debug,release threading=multi link=static runtime-link=static
谁能告诉我怎么回事?
更新:
在更改为 boost 1.51 后,它消除了 8 个链接器错误中的 7 个,但这个错误仍然存在
error LNK2001: unresolved external symbol "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXABVexception@std@@@Z)
我不明白这里发生了什么。这个来自 boostpro 32 位安装程序。和我的源文件没有关系吧?
更新:
好的,我已经为 boost 1.51 解决了这个问题。结果在属性页 >> C/C++ >> 代码生成 >> 启用 C++ 异常对我来说是关闭的。
好的。我将尝试查看相同的设置是否可以解决 boost 1.52 的问题。稍后会更新。
【问题讨论】:
帮不上什么忙,但我一直在使用 boost-pro 的预构建,它是带有安装程序的预构建提升包 是的,我现在正在尝试通过 boost pro 获得 1_51 版本,看看是否可以让它工作。 很好地了解启用异常。它适用于我的情况。 【参考方案1】:我之前也遇到过同样的问题:我使用默认参数构建 boost lib,直接运行 bootstrap.bat。
如果您在项目中使用 boost::system,则应使用并指定 x86 或 x64 版本的 boost::system 库。
你可以用这个bat重新编译boost lib,将它们保存到boost根文件夹并在CMD窗口中运行(不要双击!):
call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86
cd boost_1_60_0
call bootstrap.bat
rem Most libraries can be static libs
b2 -j8 toolset=msvc-14.0 address-model=64 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/x64
b2 -j8 toolset=msvc-14.0 address-model=32 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/win32
pause
有关更多详细信息,您可以查看这篇文章: https://studiofreya.com/2015/12/19/how-to-build-boost-1-60-with-visual-studio-2015/
【讨论】:
【参考方案2】:在我看来,它没有正确的自动链接。
Include path is boost152/ only
Library path is boost152/stage/lib
【讨论】:
嗯...我去柜台检查了。我已将环境变量设置为:'$(BOOST) = %DEV%\boost_1_52_0\' where '%DEV% is C:\Dev\' 并且在属性下的 VC++ 目录中,我有以下内容:'包括:$ (BOOST)' '库:$(BOOST)stage\lib\'【参考方案3】:确保将正确的目录添加到链接器属性中。
阅读这篇文章了解更多详情 Boost linker error: Unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_system_category(void)"
您还必须将此路径添加到链接器添加目录中:
$(BOOST_ROOT)\bin.v2\libs\thread\build\msvc-xx.0\release\address-model-64\link-static\threading-multi
xx 是你的 Visual Studio 版本
【讨论】:
嗨,我在发布我的问题之前偶然发现了那个帖子。已经完成了那里所说的事情,但仍然没有运气。 你能在这里发布你的链接器添加目录吗? $(BOOST)stage\lib\;$(LibraryPath) BOOST 是 C:\Dev\boost_1_52_0\ 另一个提示。如果您使用的是 Visual Studio,请注意您必须先关闭它,然后它才能读取新的环境变量。例如,在 Visual Studio 2005 中,您必须关闭 VS2005 的所有实例。 是的,我确实知道这一点。所以每次我改变我的环境变量。我将重新启动我的 VS 以考虑更改。【参考方案4】:下面这两个定义弄乱了我的链接器,抛出了一个漂亮的“LNK2001:未解析的外部符号”错误。那么你的代码中有什么地方吗?
//#define BOOST_FILESYSTEM_NO_DEPRECATED
//#define BOOST_FILESYSTEM_NO_LIB
【讨论】:
以上是关于尝试链接 Boost 1.52 线程的主要内容,如果未能解决你的问题,请参考以下文章
简单线程程序的链接器错误(来自 boost_chrono 的符号丢失)
当 read_json 在多个线程中使用而不与 boost.thread 库链接时,我们是不是可以始终使用 BOOST_SPIRIT_THREADSAFE 标志?