conan profile 中的 compiler.runtime 仅用于标识 abi 兼容性并影响包 id,不直接控制 msvc 运行库链接方式;真正生效的是 cmake 中显式设置的 cmake_msvc_runtime_library,且必须与 profile 中的 compiler.runtime 值严格一致(dynamic↔multithreaded$dll,static↔multithreaded$),否则将导致二进制不匹配或 lnk2038 链接错误。

Conan Profile 本身不控制 MSVC 运行库
Profile 里没有 msvc_runtime_library 或类似字段,它只负责描述目标平台的编译环境(如 compiler、compiler.version、compiler.runtime 等),而 MSVC 运行库链接方式(/MD /MT)是由构建系统(CMake)在生成阶段决定的,Conan 只传递上下文信息。你看到的 compiler.runtime 是给 Conan 自己用的——用来区分不同运行库配置下的二进制包 ID,不是直接下发给 cl.exe 的开关。
真正起作用的是 CMake 的 MSVC_RUNTIME_LIBRARY
Conan 通过 CMakeToolchain 生成器把 profile 中的 compiler.runtime 映射为 CMake 变量,但最终是否生效、怎么生效,取决于你在 CMakeLists.txt 中是否显式设置了 MSVC_RUNTIME_LIBRARY。常见误区是以为只要 profile 写了 compiler.runtime=dynamic,CMake 就会自动用 /MD;其实不会。
-
compiler.runtime=dynamic→ Conan 会把该值注入CMakeToolchain,并影响包 ID,但 CMake 默认仍可能用 /MT(尤其老项目或未设MSVC_RUNTIME_LIBRARY时) -
compiler.runtime=static→ 同理,仅影响包选择逻辑,不强制 CMake 改链接方式 - 必须在 CMakeLists.txt 中设置:
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$:Debug>DLL")才真正控制编译器命令行参数
Profile 中 compiler.runtime 的合法值与含义
这个字段只用于标识 ABI 兼容性,必须和 CMake 实际使用的运行库类型严格一致,否则依赖链接会失败(比如你 profile 声明 dynamic,但 CMake 用了 MultiThreaded 静态链接,Conan 拉来的动态版 jsoncpp 就无法链接)。
-
dynamic:对应 CMake 的MultiThreaded$:Debug>DLL(即 /MD 或 /MDd) -
static:对应MultiThreaded$:Debug>(即 /MT 或 /MTd) - 不能写成
md、mt、dll等非标准值,Conan 不识别 - 若 profile 缺失该字段,Conan 默认按
dynamic处理,但强烈建议显式声明
Conan + CMake 多配置(VS)下容易漏掉的关键点
Windows 上用 Visual Studio 生成器时,CMake 一次生成 Debug/Release 两套配置,但 MSVC_RUNTIME_LIBRARY 是全局变量,不能按 config 切换——它会在 link 步骤被统一应用。这意味着你无法靠一个 CMakeLists.txt 同时支持 /MD 和 /MT,必须靠 profile 分离构建上下文。
- 想让 Debug 用 /MDd、Release 用 /MD?不行,CMake 不支持 per-config runtime 设置;只能统一用
MultiThreaded$:Debug>DLL - 想静态链接所有配置?设
MSVC_RUNTIME_LIBRARY为MultiThreaded$:Debug>,同时 profile 中compiler.runtime=static - 第三方库(如 zlib、openssl)必须用相同
compiler.runtime构建,否则链接时报LNK2038: mismatch detected for 'RuntimeLibrary'











