CMake项目接入Conan无需修改原有逻辑,关键在构建流程:先执行conan install生成CMakeDeps/CMakeToolchain文件,再运行cmake configure;CMakeLists.txt仅需在project()后、add_executable()前添加两行——include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)和find_package(... CONFIG),且必须显式指定--output-folder=build与编译器settings以确保ABI兼容。

CMake项目接入Conan,绝大多数情况下无需修改CMakeLists.txt原有逻辑,关键改动只在构建命令和少量初始化语句上;改错位置或顺序会导致find_package找不到包、链接失败或生成空配置文件。
conan install 命令必须在 cmake configure 之前执行
Conan 不是 CMake 的插件,它不自动监听 CMake 配置过程。所有依赖信息(如 fmt-config.cmake)都由 conan install 生成并写入指定目录,CMake 后续才去读取。
- 错误做法:直接运行
cmake .. && cmake --build .,此时generators/目录为空或不存在 - 正确流程:先
mkdir build && cd build,再conan install .. --output-folder=. --build=missing,最后cmake .. && cmake --build . - 注意
--output-folder=.:让 Conan 把CMakeDeps和CMakeToolchain输出到当前 build 目录,否则 CMake 找不到include()路径 - 若用
conanfile.py,确保其中generators = "CMakeDeps", "CMakeToolchain"已声明(Conan 2.x 默认不启用任何 generator)
CMakeLists.txt 只需两处显式改动
不是“接入 Conan”,而是“告诉 CMake 去加载 Conan 生成的文件”。这两行必须放在 project() 之后、add_executable() 之前,且顺序不能颠倒:
- 第一处:加载 toolchain(传递编译器、标准、架构等设置)
include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)
——这行会覆盖 CMake 默认的CMAKE_CXX_STANDARD等变量,所以别在它前面手动设set(CMAKE_CXX_STANDARD ...) - 第二处:加载依赖配置
find_package(fmt REQUIRED CONFIG)
——必须带CONFIG,否则 CMake 会 fallback 到 module 模式,找不到 Conan 生成的*-config.cmake - 不需要
conan_basic_setup():那是 Conan 1.x 的遗留接口,Conan 2.x 完全不用 - 不需要手动
set(CMAKE_MODULE_PATH ...):CMakeDeps 会自动把生成的 config 路径注入CMAKE_PREFIX_PATH
CMake 构建命令要加 -DCMAKE_TOOLCHAIN_FILE 参数(可选但推荐)
当使用 CMakeToolchain 生成器时,Conan 会输出一个 conan_toolchain.cmake 文件。CMake 3.23+ 支持直接用 -DCMAKE_TOOLCHAIN_FILE 加载它,比在 CMakeLists.txt 里 include() 更干净,也避免污染源码。
- 启用方式:
cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake .. - 此时 CMakeLists.txt 中那行
include(...)就可以删了 - 注意路径:toolchain 文件一定在 build 目录下,不是源码目录;如果
conan install指定了--output-folder=build,那它就在build/conan_toolchain.cmake - 不加这个参数也能工作,但 CMake 可能忽略 Conan 设置的
compiler.cppstd或os.api_level,尤其在 Android/iOS 交叉编译时出问题
最容易被忽略的是 profile 与实际环境的匹配:Conan 默认用 conan profile detect 生成 ~/.conan2/profiles/default,但如果你在 macOS 上用 Clang 编译却在 conan install 里漏掉 -s compiler=apple-clang,它可能按 Linux profile 解析依赖,导致下载的二进制 ABI 不兼容。建议每次 conan install 都显式传 -s 或用 --profile 指定。


















