conan在windows的cmake工程中可用,但需规避路径分隔符、profile编译器识别不准、工具链加载时机错位等陷阱;conan install必须在conanfile.txt所在目录执行,toolchain必须在project()后、find_package()前引入,且需手动校验profile设置与动态库dll路径。

Conan 在 Windows 上的 CMake 工程里能用,但必须绕开几个 Windows 特有陷阱:路径分隔符、profile 编译器识别不准、CMake 工具链加载时机错位。
conan install 必须在 conanfile 所在目录执行,不是 build 目录也不是项目根目录
很多人把 conanfile.txt 放在项目根目录,却在 build/ 里执行 conan install .. --build=missing,结果报错 ConanException: No conanfile.py or conanfile.txt found。
- 正确做法是:cd 进
conanfile.txt所在目录(通常是项目根),再运行conan install . --build=missing -s build_type=Release - Windows 下路径不能写成
conan install ./src,除非你真把conanfile.txt放进了src/且已cd src - 生成的
generators/默认在当前目录,CMakeLists.txt 里要按实际路径 include,比如include(${CMAKE_CURRENT_LIST_DIR}/generators/conan_toolchain.cmake)
CMakeLists.txt 中 toolchain 和 find_package 的顺序不能颠倒
Windows 上常见错误是先 find_package(fmt CONFIG REQUIRED) 再 include(...toolchain.cmake),导致 CMake 用系统默认 FindXXX.cmake 找库,而不是 Conan 生成的 fmtConfig.cmake。
- 必须把
include(...conan_toolchain.cmake)放在project()之后、任何find_package()之前 - 如果用了
CMakeDeps生成器,也要确保find_package(fmt CONFIG REQUIRED)后接target_link_libraries(myapp PRIVATE fmt::fmt),不能漏掉::fmt命名空间 - 避免混用:禁用 CMake 自带的
FindXXX.cmake,可在project()后加set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
profile 检测 GCC/MinGW 容易出错,建议手动创建
conan profile detect 在 Windows 上对 MinGW 或 MSVC 的 compiler.version 和 compiler.libcxx 经常猜错,尤其用 VS Code + MingW64 时。
- 执行
conan profile new mingw64_release --detect后,务必用conan profile show mingw64_release检查输出 - 常见错误项:
compiler.libcxx=libstdc++11(对 MinGW 正确),但有时被误设为libc++;compiler.exception=seh(MSVC)或dwarf(MinGW)必须匹配实际调试器 - 推荐直接编辑 profile 文件,例如
[settings]块里明确写:compiler=gcc、compiler.version=14、compiler.libcxx=libstdc++11、compiler.threads=posix
动态链接选项 -o *:shared=True 在 Windows 上需额外注意 DLL 路径
Windows 不像 Linux/macOS 自动把 .dll 加入 PATH,conan install -o *:shared=True 成功后,程序运行时大概率报 The code execution cannot proceed because xxx.dll was not found。
- Conan 默认把 DLL 放进
bin/子目录,你需要手动把该路径加入运行环境 PATH,或在 CMake 中用set_target_properties(myapp PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - 更稳妥的做法是:只对真正需要动态链接的库开
-o spdlog:shared=True,其他如fmt保持静态(-o fmt:shared=False) - 调试时可用
dumpbin /dependents myapp.exe查看缺失的 DLL 名称,再用conan remote list和conan search确认该库是否提供对应二进制
最麻烦的其实是 lockfile 和 profile 的耦合——改一个 settings(比如从 build_type=Debug 切到 Release),就得重跑 conan install 生成新 conan.lock,否则 CMake 可能悄悄复用旧二进制导致链接失败。这个细节在 Windows 上比 Linux 更难排查。











