如何使用“clang-win”工具集构建调试Boost静态库?

问题描述 投票:0回答:2

我在使用

clang-win
工具集构建标准和运行时支持库的调试版本时遇到问题(使用
msvc
工具集一切都按预期工作)

具体来说,我正在尝试构建 lib 文件的

mt-gd
变体,因此我添加了
runtime-debugging=on
开关,如 Boost 文档 所说,但无济于事
这是我得到的:

1)

b2 toolset=msvc-14.1 address-model=64 --with-filesystem variant=release

生成
libboost_filesystem-vc141-mt-x64-1_72.lib
[正确]

2)

b2 toolset=msvc-14.1 address-model=64 --with-filesystem runtime-debugging=on variant=debug

生成
libboost_filesystem-vc141-mt-gd-x64-1_72.lib
[正确]

3)

b2 toolset=clang-win address-model=64 --with-filesystem variant=release

生成
libboost_filesystem-clangw9-mt-x64-1_72.lib
[正确]

4)

b2 toolset=clang-win address-model=64 --with-filesystem runtime-debugging=on variant=debug

生成
libboost_filesystem-clangw9-mt-d-x64-1_72.lib
[错误]
应该是
libboost_filesystem-clangw9-mt-gd-x64-1_72.lib

boost 1.67
boost 1.68
boost 1.71

具有相同的行为 有人知道出了什么问题吗?

谢谢

c++ boost clang libraries
2个回答
3
投票

该问题似乎已在 版本 1.74 中得到解决。我尝试过跑步

b2 toolset=clang-win address-model=64 variant=debug --with-filesystem

生成文件:

stage\lib\libboost_filesystem-clangw9-mt-gd-x64-1_74.lib
,如预期。

如果您必须坚持使用 boost 版本,对我来说,只需重命名库文件也可以。或者,您可以跳过自动链接并通过定义预处理器宏来显式指定库

BOOST_ALL_NO_LIB


2
投票

我遇到了类似的问题。使用runtime-debugging=on或off构建将构建不带g标签的.lib文件。

b2 -a -j16 toolset=clang-win cxxflags="-D_CRT_SECURE_NO_WARNINGS -D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING" architecture=x86 address-model=64 runtime-link=static runtime-debugging=on --build-type=complete --layout=tagged variant=debug,release --without-mpi --without-python stage --stagedir=clangw10

会生成类似

libboost_thread-mt-sd-x64.lib
的文件,并且链接到它会破坏链接过程,例如:

LINK Pass 1: command "C:\PROGRA~2\MICROS~1\2019\COMMUN~1\VC\Tools\Llvm\bin\lld-link.exe CMakeFiles\test.dir\cmake_pch.cxx.obj CMakeFiles\test.dir\resources\win.rc.res CMakeFiles\test.dir\main.cpp.obj /out:test.exe /implib:test.lib /pdb:test.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:windows E:\SDKs\boost_1_72_0\stage\lib\libboost_thread-mt-sd-x64.lib E:\SDKs\boost_1_72_0\stage\lib\libboost_chrono-mt-sd-x64.lib E:\SDKs\boost_1_72_0\stage\lib\libboost_date_time-mt-sd-x64.lib E:\SDKs\boost_1_72_0\stage\lib\libboost_atomic-mt-sd-x64.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\test.dir/intermediate.manifest CMakeFiles\test.dir/manifest.res" failed (exit code 1) with the following output:

E:\Workspace\test\build\x64-Debug\lld-link : error : could not open 'boost_thread-clangw10-mt-gd-x64-1_72.lib': no such file or directory

E:\Workspace\test\build\x64-Debug\lld-link : error : could not open 'libboost_date_time-clangw10-mt-gd-x64-1_72.lib': no such file or directory

E:\Workspace\test\build\x64-Debug\lld-link : error : could not open 'libboost_chrono-clangw10-mt-gd-x64-1_72.lib': no such file or directory

看起来这些库都依赖于运行时调试,但如果 b2 无法生成这些库,我就陷入困境了。

更新 通过在 .lib 的文件名中添加“g”并使用 --layout=versioned

构建 boost,我能够成功地将我的程序与 cmake 链接起来

为了链接正确的文件,我必须添加到 CMakeLists.txt

set_property(TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

© www.soinside.com 2019 - 2024. All rights reserved.