conan install 必须在含 conanfile.txt 或 conanfile.py 的目录执行,使用 conan install . --output-folder=build --build=missing;生成的 fmt-config.cmake 等文件位于 build/ 目录,cmakelists.txt 需先 include(${cmake_binary_dir}/conan_toolchain.cmake) 再 find_package(fmt required config)。

检查 conan install 是否在正确目录执行
Conan 生成的配置文件(如 fmt-config.cmake)只会在运行 conan install 的当前目录产出,CMake 不会自动向上或向下搜索。很多人把 conanfile.txt 放在 src/ 或 conan/ 子目录里,却在项目根目录下执行 conan install ..,结果 CMake 找不到任何 *Config.cmake 文件。
确认方式很简单:
- cd 进含
conanfile.txt或conanfile.py的目录 - 运行
conan install . --output-folder=build --build=missing(注意是.,不是..) - 检查
build/目录下是否生成了fmt-config.cmake、conan_toolchain.cmake等文件
确认 CMake 是否加载了 Conan 生成的 toolchain 和 deps
find_package(fmt REQUIRED CONFIG) 能成功,前提是 CMake 知道去哪里找 fmt-config.cmake。Conan 2.x 默认不修改 CMAKE_PREFIX_PATH,必须显式引入工具链和依赖配置。
典型错误写法:
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) # Conan 2.x 已弃用,且路径也不对
正确做法(CMakeLists.txt 开头):
-
include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)—— 提供编译器、标准库等设置 -
find_package(fmt REQUIRED CONFIG)—— 必须带CONFIG,否则 fallback 到 FindXXX 模块,大概率失败 - 确保
find_package()出现在project()之后、add_executable()之前
验证 find_package() 的版本与 Conan 安装的是否一致
Conan 下载的包版本和 find_package() 声明的版本不匹配时,CMake 会静默跳过或报 Could not find a configuration file。这不是路径问题,而是版本未对齐。
常见原因:
-
conanfile.txt写的是fmt/10.2.1,但 CMake 中写find_package(fmt 10.2.0 REQUIRED CONFIG)—— 小版本差一位也会失败 - Conan 安装时用了
--build=missing,但构建中途出错,实际没装上;可查build/conanlog.log或运行conan list "fmt/*" -r=conancenter - 依赖包本身没提供
CONFIG模式(比如老版本 zlib),此时find_package(zlib REQUIRED CONFIG)必然失败,得改用find_package(zlib REQUIRED)+target_link_libraries(... PRIVATE ${ZLIB_LIBRARIES})
留意 Conan 生成的 *-config.cmake 文件是否被 CMake 正确识别
CMake 查找 xxx-config.cmake 依赖 CMAKE_PREFIX_PATH 和 CMAKE_MODULE_PATH,而 Conan 2.x 的 CMakeDeps 生成器默认把 config 文件放在 ${CMAKE_BINARY_DIR},但不会自动追加到 CMAKE_PREFIX_PATH —— 它靠 conan_toolchain.cmake 里的 set(CMAKE_PREFIX_PATH ...) 注入。
所以如果跳过了 include(conan_toolchain.cmake),或者把它放在 find_package() 之后,CMake 就根本看不到那些 config 文件。
快速验证:在 CMakeLists.txt 中加一行:
message(STATUS "CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
构建时看输出里是否有 build/ 路径;没有,说明 toolchain 没生效或顺序错了。
CMake 找不到 Conan 依赖,90% 的情况不是包没下载,而是路径没对上、toolchain 没加载、或 find_package() 缺少 CONFIG。最容易忽略的是:你改了 conanfile.txt 后没重跑 conan install,或者 build/ 目录残留旧配置干扰了新生成的文件。











