VS2019使用Clang编译带Boost的C++项目出现lld-link错误如何解决
问题解决步骤
1. 补充Boost静态编译宏定义
你编译Boost时指定了link=static生成静态库,但VS项目中没有定义对应的宏,导致Boost头文件默认将导出符号识别为dll导入,才会出现带__declspec(dllimport)前缀的未定义符号。
在项目属性 -> C/C++ -> 预处理器 -> 预处理器定义中,添加以下宏:
BOOST_THREAD_STATIC_LINK BOOST_ALL_STATIC_LINK
如果仅针对Thread库单独配置,加第一个即可,全静态链接所有Boost库可以加第二个。
2. 校验Boost库的链接配置
- 确认架构匹配:你编译Boost时指定了
address-model=64 architecture=x64,要确保VS项目的目标平台也是x64,不是x86 - 确认运行时库匹配:你编译Boost时用了
runtime-link=shared,要到项目属性 -> C/C++ -> 代码生成 -> 运行库,确认Release模式下选择的是多线程 DLL (/MD),不能选静态运行时/MT - 确认Toolset匹配:确认你添加到VS链接路径的是本次用clang-win编译出来的Boost库,不要误用MSVC编译的Boost库,两种工具链生成的库符号格式不兼容
- 确认库已正确添加:到项目属性 -> 链接器 -> 输入 -> 附加依赖项,确认包含了
libboost_thread-clang12-mt-x64-xxx.lib这类对应版本的静态库文件,也可以在代码中手动添加链接指令:#pragma comment(lib, "libboost_thread-clang12-mt-x64-1_xx.lib"),注意替换成你实际使用的Boost版本号
3. 调整Boost编译参数(如果上述步骤无效)
你当前编译Boost用的是--build-type=complete,会同时生成动态、静态等多个版本的库,容易出现链接错配,可以重新编译Boost时去掉该参数,只生成你需要的版本,避免VS自动选到不对的库文件:
bootstrap --with-toolset=clang-win b2.exe link=static threading=multi runtime-link=shared address-model=64 toolset=clang-win variant=release --with-thread --with-其他你用到的Boost库 cxxflags=-std=c++14
指定只编译你用到的库,编译速度更快也不会出现库文件冲突。
内容的提问来源于stack exchange,提问作者Ehsan Sharifi Esfahani
相关产品推荐
相关产品推荐

