You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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等工具的核心实现):
    git clone --recursive https://github.com/llvm/llvm-project.git
    
    建议切换到和你之前使用的预编译LLVM同版本的分支,避免兼容性问题,比如:
    cd 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:只启用需要的子项目,大幅减少构建时长

三、编译并安装

配置完成后,你可以选择两种方式编译:

  1. 直接打开生成的VS工程,选中对应配置(Release/Debug),编译INSTALL目标
  2. 用命令行快速编译:
# 编译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项目了:

  1. 在Qt Creator中添加新编译器,路径指向C:\LLVM-MD\bin\clang-cl.exe
  2. 在项目构建选项中,确保C/C++编译器参数包含/MD(Release)或/MDd(Debug)
  3. 开启ASan时,添加编译选项/fsanitize=address,链接阶段会自动匹配对应的动态ASan库

注意事项

  • 必须保证LLVM源码版本和你之前使用的预编译版本一致,否则可能出现ABI不兼容问题
  • 如果构建中遇到编译错误,尝试更新CMake和Visual Studio到最新版本,或检查是否缺失依赖
  • Debug版ASan库对应MDd,Release版对应MD,绝对不要混用

内容的提问来源于stack exchange,提问作者FourtyTwo

火山引擎 最新活动