conan install 生成 conan_toolchain.cmake、xxx-config.cmake(如 fmt-config.cmake)和 conan.lock 等配置文件,供 cmake 正确查找依赖与设置编译环境,而非生成 makefile 或 ninja 文件。

Conan 本身不生成 Makefile 或 Ninja 文件,它生成的是供构建系统使用的配置文件(如 toolchain、deps),真正的构建文件由 CMake / Make 等工具生成。 你执行 conan install 后得到的不是 Makefile,而是让 CMake 能正确找到头文件和库的中间配置——这点容易误解,直接导致后续 cmake .. 报 find_package(fmt CONFIG REQUIRED) 找不到包。
conan install 生成哪些文件?
运行 conan install . -if build --build=missing 后,build/ 目录下通常出现:
-
conan_toolchain.cmake:包含编译器路径、CMAKE_CXX_STANDARD、sysroot、arch等,由CMakeToolchain生成器产出 -
fmt-config.cmake、spdlog-config.cmake等:供find_package(fmt CONFIG REQUIRED)使用,由CMakeDeps生成器产出 -
conan.lock(如果用了conan lock):锁定所有依赖的精确版本与 package ID,确保可复现
这些都不是构建文件本身,而是 CMake 的“输入配置”。漏掉其中任一,CMake 就无法定位依赖。
CMakeLists.txt 必须显式 include conan_toolchain.cmake
很多人写完 conan install 就直接 cmake ..,但没在 CMakeLists.txt 开头加这句:
include(${CMAKE_CURRENT_LIST_DIR}/build/generators/conan_toolchain.cmake)
后果是:CMAKE_CXX_STANDARD 不生效、交叉编译用错 CC、libstdc++ 版本不匹配。尤其在嵌入式场景下,arch 和 os 错一个字符,链接就会失败。
注意路径要和 -if 参数一致;如果用了 --output-folder=build,那路径就是 build/generators/,不是 build/ 根目录。
为什么 conan install 不直接调用 cmake?
因为 Conan 是构建系统无关的。它只管“提供什么”,不管“怎么构建”:
- 你用 Ninja,它就生成
conan_toolchain.cmake+*-config.cmake - 你用 Visual Studio,它也能生成对应
conan_toolchain.cmake,但 CMake 需用-G "Visual Studio 17 2022"配合 - 你用 Makefile,Conan 不生成 Makefile,但你可以用
AutotoolsDeps生成configure.ac可读的变量
常见错误:conan install . -g cmake_find_package(旧版生成器)和 CMakeDeps 混用,导致 find_package() 找到旧路径、target_link_libraries() 链错库。
Debug/Release 构建必须全程对齐 settings
conan install 时指定的 -s build_type=Debug 不仅影响当前项目,还会驱动整个依赖图选择 Debug 版二进制(如 fmt::fmtd)。但如果 CMake 命令里漏了 -DCMAKE_BUILD_TYPE=Debug,或 profile 里 build_type 写成 RelWithDebInfo,就会出现:
- 链接时混合 Debug/Release 运行时(
MSVCRTD.libvsMSVCRT.lib)→ LNK2038 - ABI 不兼容(
std::string在 Debug 下有额外检查字段)→ 运行崩溃 - Conan 找不到匹配的 package ID → 提示
Missing prebuilt package,却误以为要--build=missing重编
真正关键的是:profile 中的 build_type、conan install 的 -s、CMake 的 -DCMAKE_BUILD_TYPE、以及最终 target_compile_options() 的实际效果,四者必须严格一致。
最易被忽略的一点:conan_toolchain.cmake 里写的 CMAKE_SYSTEM_PROCESSOR 和你交叉编译用的 sysroot 是否真能匹配目标板 —— 很多 ARM64 项目卡在这一步,报 cannot find -lc,其实只是 toolchain 文件里 CMAKE_SYSROOT 指向了一个空目录。











