c++ - 无法链接到提升
问题描述
我尝试建立一个反对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 文件位于同一目录中。
解决方案
推荐阅读
- php - 数据未提取到下拉列表中
- python - ParseError: not well-formed (invalid token) using ElementTree
- vue.js - 如何在 Vuex 操作完成之前阻止 Vue 生命周期继续进行?
- node.js - 如何解决 .forEach 循环,以免我向 api 发送垃圾邮件?
- c# - 如何检索 Program.cs 中返回的访问令牌以在 Startup.cs 中可用?
- ios - Apple 拒绝 - ITMS-90338:非公共 API 使用 - databasePool:didAddDatabase:, databasePool:shouldAddDatabaseToPool:, ddSetLogLevel
- material-ui - Material-UI TextField:控制边框颜色
- python - 如果我们有多个条件,为什么 if 条件评估失败?
- apache - 从 Apache 代理反向中的重定向 URL 传递多个参数
- python-2.7 - 将任务的不同步骤记录到python中的单个文件中