如何在Boost用户配置文件中正确传递-fuse-ld=lld参数?
如何在Boost用户配置文件中正确传递-fuse-ld=lld参数?
我懂你这种纠结——用msvc-wine配合clang-cl在Linux上编译Windows二进制,Boost.Build的配置里试了<compileflags>和<linkflags>都没法把-fuse-ld=lld传给clang-cl,只能临时塞到wrapper脚本里,总觉得不是正道对吧?
其实问题出在Boost.Build对clang-win工具集的参数传递逻辑上:-fuse-ld=lld是clang驱动本身的参数,用来指定链接器为lld,而非传统意义上直接传给链接器的参数。所以你需要用更合适的配置项来传递它,这里有两种稳妥的方式:
方式一:用<cxxflags>传递(推荐)
<cxxflags>会把参数直接传给clang-cl驱动,不管是编译还是链接阶段都会生效,刚好匹配-fuse-ld=lld的需求。修改你的user-config.jam如下:
using clang-win : : clang-msvc.sh : <manifest-tool>llvm-mt <compileflags>/std:c++17 <compileflags>/EHa <cxxflags>-fuse-ld=lld ;
方式二:用<rawflags>强制传递
如果你希望确保参数原封不动传给clang-cl,可以用<rawflags>,它会跳过Boost.Build的参数解析逻辑,直接把参数传递给工具:
using clang-win : : clang-msvc.sh : <manifest-tool>llvm-mt <compileflags>/std:c++17 <compileflags>/EHa <rawflags>-fuse-ld=lld ;
为什么之前的<linkflags>没生效?
Boost.Build的<linkflags>默认是用来传递给底层链接器的参数,但这里我们是要告诉clang驱动去调用lld,而不是直接给lld传参数。所以<linkflags>的参数会被clang-cl当成传给链接器的选项,而非驱动本身的指令,自然不会生效。
验证配置是否生效
你可以在运行Boost.Build时加上-d+2参数,查看实际执行的命令行,确认-fuse-ld=lld已经出现在clang-cl的参数列表里,这样就说明配置成功了。
备注:内容来源于stack exchange,提问作者Robert Stewart
相关产品推荐
相关产品推荐

