conan 的 build_type 和 compiler.runtime 必须显式声明在 host profile 中,否则会导致二进制不匹配、lnk2038/lnk2005 等链接错误;vs 多配置下还需配合 --config 与 cmakedeps 一致。

MSVC项目必须用 host profile 对齐 build_type
Conan 不会自动猜你用的是 Debug 还是 Release;build_type 是 settings 的一部分,直接参与 package ID 计算。你在 Visual Studio 里切 Release 配置,Conan 却按 Debug 拉二进制,链接时大概率报 LNK2038: mismatch detected for 'RuntimeLibrary' 或符号找不到。
关键动作是:确保你的 profile 里明确写了 build_type=Release(或 Debug),且和 CMake 的 -DCMAKE_BUILD_TYPE 或 VS 的 --config 一致。
-
conan profile show default看当前 default 是否含build_type;若没有,它会 fallback 到Release(不安全) - 新建 profile 时别只复制编译器版本,漏掉
build_type:[settings] os=Windows arch=x86_64 compiler=msvc compiler.version=193 compiler.runtime=dynamic compiler.cppstd=17 build_type=Release
- VS 多配置生成器(如
Visual Studio 17 2022)下,conan install必须加--config Release,且 profile 的build_type必须匹配,否则 CMakeDeps 生成的conan_deps.cmake会指向错误的库路径
MSVC runtime 必须显式指定 compiler.runtime
MSVC 下 /MD 和 /MT 生成的库 ABI 不兼容,Conan 默认不设 compiler.runtime,profile 里漏写会导致拉错二进制——比如你项目用 /MDd(Debug 动态 CRT),但 profile 里没写 compiler.runtime=dynamic,Conan 可能按 static 拉包,链接时报 LNK2005: xxx already defined in libcmt.lib。
一款AI工具,主要用于在主代理响应前,并行运行Kimi K2.5和GPT 5.3 Codex,注入双方观点以增强认知多样性,适合需要提升相关任务效率的用户。
- 对照你项目的属性页 →
Code Generation → Runtime Library,填对应值:dynamic(/MD 或 /MDd)、static(/MT 或 /MTd) - 不要依赖
conan profile detect:它在 Windows 上常把compiler.runtime判成static,哪怕你实际用的是/MD - 示例正确写法:
[settings] compiler.runtime=dynamic compiler.runtime_type=Debug # 仅当 build_type=Debug 且用 /MDd 时需要
(注意:runtime_type是 Conan 2.x 才支持的细粒度控制,1.x 只认runtime)
交叉编译场景下必须拆开 host / build profile
你在 Windows 上用 MSVC 编译一个 ARM64 Linux 的库?这时候不能只靠一个 profile。host profile 描述目标产物(ARM64 + Linux + gcc),build profile 描述你本地构建工具链(x86_64 + Windows + msvc)。混用会直接导致 conan install 报 Cannot find a valid package 或静默拉错架构的二进制。
- 用
-pr:h profiles/arm64-linux-gcc指定目标环境,-pr:b profiles/win-msvc指定本地编译器 - host profile 里禁止出现
compiler=msvc—— MSVC 无法生成 Linux 二进制,Conan 会拒绝解析 - build profile 可复用 default,但需确认它不含
os=Linux这类与宿主机矛盾的设置 - 常见坑:
CONAN_CMAKE_TOOLCHAIN_FILE环境变量只影响 CMake 工具链生成,不影响 Conan 自身的 settings 解析——profile 才是唯一权威来源
Profile 文件位置和生效优先级容易搞混
Conan 查 profile 的顺序是:--profile 命令行参数 > conanfile.txt/py 里的 [conf] > 当前目录 ./conan/profiles/ > 用户目录 ~/.conan2/profiles/。很多人改了 ~/.conan2/profiles/default,却在项目里执行 conan install -pr:h myprofile,结果 profile 还是没生效。
- 调试技巧:
conan install . -pr:h myprofile --dry-run看输出里解析出的 settings 是否符合预期 - 项目级 profile 推荐放
./profiles/win-msvc-release,避免污染全局 default - CI 流水线中禁用 default profile,强制用
-pr:h和-pr:b显式传入,防止因本地 default 被意外修改导致构建不一致 - 注意:Conan 2.x 的 profile 路径语法支持
./profiles/foo和foo(自动查默认路径),但conan install -pr:h foo和-pr:h ./profiles/foo行为一致;而-pr:h foo在找不到时不会 fallback 到~/.conan2/profiles/foo
实际项目里最常被忽略的,是 build_type 和 compiler.runtime 这两个字段的显式声明——它们不出现在 conan profile detect 的输出里,也不在多数教程的 profile 示例中强调,但缺一不可。










