conan install 生成的文件在指定输出目录(如 build/)根目录下,包括 conan_toolchain.cmake 和 xxx-config.cmake(如 fmt-config.cmake),以及 generators/ 子目录;其中 conan_toolchain.cmake 含编译配置,xxx-config.cmake 供 find_package 使用。

conan install 生成的文件在哪、叫什么
Conan 不会自动修改你的 CMakeLists.txt,它只负责在你指定的输出目录(比如 build)里生成一堆 .cmake 文件。关键就两点:你得知道它生成了啥,以及 CMake 怎么找到它们。
典型命令是:conan install . --output-folder=build --build=missing。执行后,build/ 下会出现:
-
conan_toolchain.cmake:含编译器标志、标准、架构等设置 -
fmt-config.cmake(或类似名字,如boost-config.cmake):供find_package(fmt)加载的配置模块 -
generators/目录(旧版可能直接平铺):现代 Conan 2.x 默认把生成文件放进这里
注意:conan_toolchain.cmake 的路径必须和你在 CMake 中 include() 的路径一致;如果用 --output-folder=build,那它就在 build/conan_toolchain.cmake,不是 build/generators/ 里。
在 CMakeLists.txt 中怎么正确 include 这些文件
顺序和位置直接影响能否链接成功。错误写法(比如放在 project() 前)会导致 CMAKE_TOOLCHAIN_FILE 未生效,C++ 标准或编译器选项被忽略。
正确做法(Conan 2.x + CMake 3.23+ 推荐):
-
include()必须放在project()之后、任何add_executable()或find_package()之前 -
include()路径要基于CMAKE_CURRENT_LIST_DIR或CMAKE_BINARY_DIR,不能硬编码相对路径 - 推荐用
${CMAKE_BINARY_DIR}/conan_toolchain.cmake,因为conan install默认把 toolchain 放到 output folder 根目录
示例片段:
cmake_minimum_required(VERSION 3.23)
project(hello LANGUAGES CXX)
<h1>✅ 正确:project 后立即 include,且路径可移植</h1><p>include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)</p><p>set(CMAKE_CXX_STANDARD 17)
add_executable(hello src/main.cpp)</p><h1>✅ find_package 在 include 之后,才能读到 Conan 生成的 config</h1><p>find_package(fmt REQUIRED)
target_link_libraries(hello PRIVATE fmt::fmt)find_package(fmt) 找不到包?检查三个关键点
常见报错是 find_package(fmt REQUIRED) 失败,提示 “Could not find a package configuration file provided by ‘fmt’”。这不是 CMake 问题,而是 Conan 生成或 CMake 查找路径没对齐。
- 确认
conan install是否真的成功执行,并生成了fmt-config.cmake(或fmtConfig.cmake)—— 它必须出现在CMAKE_PREFIX_PATH搜索范围内 - 确保
generators = "CMakeDeps"已声明(conanfile.py)或[generators] CMakeDeps已写入(conanfile.txt),否则不会生成*-config.cmake - 检查 CMake 是否收到
CMAKE_PREFIX_PATH:Conan 的CMakeDeps生成器会把路径注入该变量;但如果你手动调用cmake ..而没传-DCMAKE_TOOLCHAIN_FILE=...,toolchain 不生效,CMake 就不知道去哪找
简单验证方法:运行 cmake -L -N .. 看输出里有没有 CMAKE_PREFIX_PATH,它的值应该包含 Conan 生成文件所在目录。
为什么有时要同时用 CMakeToolchain 和 CMakeDeps
这两个生成器分工明确,缺一不可:
-
CMakeToolchain解决“怎么编译”:统一 C++ 标准、编译器定义、构建类型(Debug/Release)、平台宏(WIN32,__linux__)等,避免手动在 CMakeLists.txt 里重复设set(CMAKE_CXX_STANDARD ...) -
CMakeDeps解决“用什么库”:生成每个依赖的*-config.cmake,让find_package(Xxx)可以定位头文件路径、链接库名、依赖传递关系
漏掉 CMakeToolchain → 编译可能失败(比如用了 C++20 特性但 CMake 还按 C++14 编);漏掉 CMakeDeps → find_package 找不到库,链接时报 undefined reference。两者都启用才是 Conan 2.x 的标准集成方式。


















