Windows下构建链接动态VC++运行时的Clang Compiler-RT及ASan配置问题
构建链接动态Visual C++运行时的Clang Compiler-RT(含AddressSanitizer)
我之前也遇到过和你一模一样的问题——官方预编译的LLVM/Clang绑定了静态CRT(/MT),没法和用/MD编译的Qt项目搭配AddressSanitizer(ASan)。折腾了好一阵,终于搞清楚了怎么修改LLVM的构建配置来生成用/MD链接的Compiler-RT,下面是具体步骤:
一、准备工作
首先得搭好构建环境:
- 安装Visual Studio(必须勾选C++桌面开发工具链,确保包含MSVC编译器、Windows SDK)
- 安装CMake(建议3.20及以上版本,兼容性更好)
- 克隆LLVM源码仓库(记得带上
compiler-rt子项目,它是ASan等工具的核心实现):
建议切换到和你之前使用的预编译LLVM同版本的分支,避免兼容性问题,比如:git clone --recursive https://github.com/llvm/llvm-project.gitcd llvm-project git checkout tags/llvmorg-17.0.6
二、关键CMake配置修改
核心是修改LLVM构建时的CRT链接选项,让它默认使用动态CRT(/MD/MDd)而非静态CRT(/MT/MTd)。创建一个build目录并进入,执行以下CMake命令(以VS2022 x64为例):
cmake -G "Visual Studio 17 2022" -A x64 ^ -DCMAKE_INSTALL_PREFIX="C:\LLVM-MD" ^ # 自定义安装路径,避免覆盖官方版本 -DLLVM_USE_CRT_RELEASE=MD ^ # Release版本绑定/MD -DLLVM_USE_CRT_DEBUG=MDd ^ # Debug版本绑定/MDd -DCMAKE_C_FLAGS_RELEASE="/MD /O2 /Ob2 /DNDEBUG" ^ -DCMAKE_CXX_FLAGS_RELEASE="/MD /O2 /Ob2 /DNDEBUG" ^ -DCMAKE_C_FLAGS_DEBUG="/MDd /Zi /Ob0 /Od /RTC1" ^ -DCMAKE_CXX_FLAGS_DEBUG="/MDd /Zi /Ob0 /Od /RTC1" ^ -DLLVM_ENABLE_PROJECTS="clang;compiler-rt" ^ # 只构建clang和compiler-rt,节省时间 ..\llvm
参数说明:
LLVM_USE_CRT_RELEASE/LLVM_USE_CRT_DEBUG:LLVM全局CRT配置,会直接传递给Compiler-RT的构建流程CMAKE_C/CXX_FLAGS_*:显式指定编译选项,确保覆盖默认的/MT设置LLVM_ENABLE_PROJECTS:只启用需要的子项目,大幅减少构建时长
三、编译并安装
配置完成后,你可以选择两种方式编译:
- 直接打开生成的VS工程,选中对应配置(Release/Debug),编译
INSTALL目标 - 用命令行快速编译:
# 编译Release版并安装,--parallel指定编译线程数(根据CPU核心数调整) cmake --build . --config Release --target INSTALL --parallel 8 # 如需Debug版,替换配置参数即可 cmake --build . --config Debug --target INSTALL --parallel 8
四、验证构建结果
编译完成后,检查安装目录下的ASan动态库,确认它绑定的是动态CRT:
dumpbin /dependents C:\LLVM-MD\lib\clang\17\lib\windows\clang_rt.asan_dynamic-x86_64.dll
如果输出中包含msvcrt.dll(Release版)或msvcrtd.dll(Debug版),说明构建成功。
五、在Qt项目中使用
现在可以用这个自定义构建的clang-cl编译Qt项目了:
- 在Qt Creator中添加新编译器,路径指向
C:\LLVM-MD\bin\clang-cl.exe - 在项目构建选项中,确保C/C++编译器参数包含
/MD(Release)或/MDd(Debug) - 开启ASan时,添加编译选项
/fsanitize=address,链接阶段会自动匹配对应的动态ASan库
注意事项
- 必须保证LLVM源码版本和你之前使用的预编译版本一致,否则可能出现ABI不兼容问题
- 如果构建中遇到编译错误,尝试更新CMake和Visual Studio到最新版本,或检查是否缺失依赖
- Debug版ASan库对应
MDd,Release版对应MD,绝对不要混用
内容的提问来源于stack exchange,提问作者FourtyTwo




