首页 > 解决方案 > 无法链接到提升

问题描述

我尝试建立一个反对boost的项目。在链接部分,我收到几个类似这样的错误:

2>main.obj : error LNK2001: unresolved external symbol "public: static class boost::unit_test::unit_test_log_t & __cdecl boost::unit_test::unit_test_log_t::instance(void)" (?instance@unit_test_log_t@unit_test@boost@@SAAEAV123@XZ)
...
2>main.obj : error LNK2019: unresolved external symbol "class boost::unit_test::master_test_suite_t & __cdecl boost::unit_test::framework::master_test_suite(void)" (?master_test_suite@framework@unit_test@boost@@YAAEAVmaster_test_suite_t@23@XZ) referenced in function "class boost::unit_test::test_suite * __cdecl init_unit_test_suite(int,char * * const)" (?init_unit_test_suite@@YAPEAVtest_suite@unit_test@boost@@HQEAPEAD@Z)

我不知道为什么会这样。我有提升版本 1.71 并将其更新为提升版本 1.73。使用 boost 1.71,我可以毫无问题地构建项目,但更新后我得到了这些错误。头文件和库文件的路径相同。我刚刚删除了旧的头文件和库文件,并用新文件替换了它们。

我如何建立提升

当我构建 boost 时,我使用这样的命令(在批处理脚本中):

call bootstrap.bat

:: ...

call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64

:: ...

b2 --build-type=complete -a toolset=msvc variant=debug threading=multi link=static address-model=64 -sBZIP_SOURCE="path\to\bzip2"  -sICU_PATH="path\to\icu" include="path\to\icu\include" -sZLIB_INCLUDE="path\to\zlib\include" -sZLIB_LIBPATH="path\to\zlib\lib64" -sZLIB_SOURCE="path\to\zlib\src"

:: ...

b2 --build-type=complete -a toolset=msvc variant=release threading=multi link=static address-model=64 -sBZIP_SOURCE="path\to\bzip2"  -sICU_PATH="path\to\icu" include="path\to\icu\include" -sZLIB_INCLUDE="path\to\zlib\include" -sZLIB_LIBPATH="path\to\zlib\lib64"  -sZLIB_SOURCE="path\to\zlib\src"

我在四个不同的版本中做同样的事情:静态/动态和发布/调试。构建完成后,我查看了构建的输出,但找不到任何错误。我在输出中搜索了“错误”一词,但找不到任何东西。此外,查看输出,似乎 boost 正在构建一切:

- atomic                   : building
- chrono                   : building
- container                : building
- context                  : building
- contract                 : building
- coroutine                : building
- date_time                : building
- exception                : building
- fiber                    : building
- filesystem               : building
- graph                    : building
- graph_parallel           : building
- headers                  : building
- iostreams                : building
- locale                   : building
- log                      : building
- math                     : building
- mpi                      : building
- nowide                   : building
- program_options          : building
- python                   : building
- random                   : building
- regex                    : building
- serialization            : building
- stacktrace               : building
- system                   : building
- test                     : building
- thread                   : building
- timer                    : building
- type_erasure             : building
- wave                     : building

所以,对我来说,这对我来说看起来不错,但不知何故,链接器在这里遗漏了一些东西。

编辑

在 vcxproj 文件中,有以下关于 boost 的设置

    <ClCompile>
      <AdditionalIncludeDirectories>...;path\to\boost\include;...;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 ...
    </ClCompile>
 ...

    <Link>
     <AdditionalLibraryDirectories>...;path\to\boost\lib64;...;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
...
    </Link>

因为Release|x64预处理器定义BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE是活动的。

编辑 2

在头文件中boost\config\user.hpp,我添加了这一行以获取更多信息

#define BOOST_LIB_DIAGNOSTIC

然后我再次编译了我的项目。我在输出中看到了这样的行

Line 13: 1>Linking to lib file: libboost_date_time-vc141-mt-gd-x64-1_73.lib
Line 14: 1>Linking to lib file: libboost_thread-vc141-mt-gd-x64-1_73.lib
Line 15: 1>Linking to lib file: libboost_chrono-vc141-mt-gd-x64-1_73.lib
Line 16: 1>Linking to lib file: libboost_filesystem-vc141-mt-gd-x64-1_73.lib
Line 17: 1>Linking to lib file: libboost_program_options-vc141-mt-gd-x64-1_73.lib
Line 18: 1>Linking to lib file: libboost_regex-vc141-mt-gd-x64-1_73.lib
Line 184: 1>Linking to lib file: libboost_log-vc141-mt-gd-x64-1_73.lib
Line 185: 1>Linking to lib file: libboost_date_time-vc141-mt-gd-x64-1_73.lib
Line 186: 1>Linking to lib file: libboost_atomic-vc141-mt-gd-x64-1_73.lib
Line 187: 1>Linking to lib file: libboost_log_setup-vc141-mt-gd-x64-1_73.lib
Line 197: 1>Linking to lib file: libboost_log-vc141-mt-gd-x64-1_73.lib
Line 198: 1>Linking to lib file: libboost_date_time-vc141-mt-gd-x64-1_73.lib
Line 216: 1>Linking to lib file: libboost_random-vc141-mt-gd-x64-1_73.lib
Line 226: 1>Linking to lib file: libboost_timer-vc141-mt-gd-x64-1_73.lib
Line 227: 1>Linking to lib file: libboost_chrono-vc141-mt-gd-x64-1_73.lib
Line 323: 2>Linking to lib file: libboost_filesystem-vc141-mt-gd-x64-1_73.lib
Line 324: 2>Linking to lib file: libboost_thread-vc141-mt-gd-x64-1_73.lib
Line 325: 2>Linking to lib file: libboost_date_time-vc141-mt-gd-x64-1_73.lib
Line 326: 2>Linking to lib file: libboost_chrono-vc141-mt-gd-x64-1_73.lib
Line 369: 2>Linking to lib file: libboost_serialization-vc141-mt-gd-x64-1_73.lib

我在这里唯一缺少的是libboost_unit_test_framework-vc141-mt-gd-x64-1_73.lib因为所有unresolved external symbol错误都以某种方式指向 boost 的测试框架。但libboost_unit_test_framework-vc141-mt-gd-x64-1_73.lib与所有其他 libboost*.lib 文件位于同一目录中。

标签: c++boostlinker

解决方案


推荐阅读