Windows下Clang编译时指定MSVC运行库的配置方法
Windows平台Clang编译指定MSVC运行库解决链接匹配错误
场景与前置配置
基于Makefile使用MSVC与Clang编译包含多个静态库、动态库及可执行文件的大型项目,此前Linux环境下Clang编译、跨Windows/Linux平台NDK编译均运行正常,当前目标为完成Windows平台全项目编译。
已完成的前置配置如下:
- 安装LLVM 14.0.5版本
- 安装Visual Studio Community 2022
- 完成Makefile对Windows平台LLVM工具链的适配
- Makefile中已引用Windows Kit关联Windows SDK,通过
lld-link.exe执行链接流程
故障表现
Clang默认选择静态msvcrt运行时(对应MSVC编译选项/MT[d]),但项目依赖的libDxBc.lib是Visual Studio以/MD[d]选项(动态调试运行库)编译生成,链接时触发运行库不匹配错误,错误信息如下:
lld-link: error: /failifmismatch: mismatch detected for RuntimeLibrary': >>> test.cpp.o has value MTd_StaticDebug >>> libDxBc.lib(api.obj) has value MDd_DynamicDebug
故障发生时使用的链接命令如下:
lld-link.exe @linker.list libDxBc.lib -ignore:LNK4217 -libpath:"c:/Program Files/Microsoft Visual Studio/2022/Community"/VC/Tools/MSVC/14.32.31326/lib/x64 -libpath:"C:/Program Files (x86)/Windows Kits/10"/Lib/10.0.20348.0/ucrt/x64 -libpath:"C:/Program Files (x86)/Windows Kits/10"/Lib/10.0.20348.0/um/x64 -machine:x64 -subsystem:console -nodefaultlib msvcrtd.lib vcruntime.lib ucrtd.lib legacy_stdio_definitions.lib legacy_stdio_wide_specifiers.lib oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib vcomp.lib rpcrt4.lib wsock32.lib setupapi.lib imagehlp.lib winmm.lib Shlwapi.lib -dll -out:test.dll -implib:test.lib -def:test.def
经排查,运行库标识是编译阶段写入目标文件test.cpp.o中的,核心要解决的问题是:如何通过编译参数、预处理器宏定义或其他方案,指定Clang编译时使用的MSVC运行库版本。
实测可行解决方案
按以下两步配置即可解决运行库不匹配问题:
- 编译阶段添加
-D_DLL预处理器宏定义,让Clang生成匹配动态运行时的目标文件标识 - 链接时通过
-nodefaultlib参数显式指定链接动态调试运行库对应依赖:msvcrtd.lib、vcruntime.lib、ucrtd.lib
内容的提问来源于stack exchange,提问作者user5706966
相关产品推荐
相关产品推荐

