Conan 生成的 xxxConfig.cmake 文件位于 build/generators/ 目录下(如 fmtConfig.cmake),由 CMakeDeps 生成器创建,需通过 include(${CMAKE_BINARY_DIR}/generators/conan_deps.cmake) 或将该路径加入 CMAKE_PREFIX_PATH 才能被 find_package(... CONFIG) 正确加载。

Conan 生成的 xxxConfig.cmake 文件在哪?
Conan 不是靠“告诉 CMake 去哪找”,而是直接生成 CMake 能原生识别的配置文件。关键在于:CMakeDeps 生成器会在你指定的输出目录(比如 build/generators/)下,为每个依赖创建一个 <packagename>Config.cmake</packagename>(如 fmtConfig.cmake)和配套的 xxxTargets.cmake。这些文件就是 find_package(fmt CONFIG) 实际加载的对象。
常见错误现象:CMake 报错 By not providing "Findfmt.cmake" in CMAKE_MODULE_PATH —— 这说明你用了 find_package(fmt)(Module 模式),但 Conan 默认只提供 Config 模式文件,没生成 Findfmt.cmake。
- 必须用
find_package(fmt REQUIRED CONFIG),显式指定 Config 模式 -
CMakeDeps是 Conan 2.x 的默认推荐生成器,cmake_find_package已弃用 - 生成路径必须被 CMake 知道:通常通过
include(${CMAKE_BINARY_DIR}/generators/conan_deps.cmake)加载(注意不是直接 include 单个 xxxConfig.cmake)
find_package(... CONFIG) 为什么还是找不到?
Config 模式查找依赖的核心是 CMAKE_PREFIX_PATH。Conan 生成的 fmtConfig.cmake 文件本身会硬编码其所在目录作为“安装前缀”,而 CMake 只有在 CMAKE_PREFIX_PATH 中包含该目录时,才能顺着它找到所有子模块。
容易踩的坑:你运行了 conan install . -if build,但 CMakeLists.txt 里没把 build/generators 加进 CMAKE_PREFIX_PATH,CMake 就根本不会去那个目录扫描 fmtConfig.cmake。
CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。
- 最稳妥的做法是在
CMakeLists.txt开头加:list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}/generators") - 或者更推荐:用
include()显式加载 Conan 生成的入口文件,例如include(${CMAKE_BINARY_DIR}/generators/conan_deps.cmake)(该文件由CMakeDeps自动生成,会内部设置好路径) - 不要依赖
-DCMAKE_PREFIX_PATH=...命令行传参——容易漏、难复现,尤其 CI 场景
Conan 和 CMake 的 settings 必须严格对齐
Conan 下载或构建的二进制包 ID,由 os、arch、compiler、build_type 等 settings 共同决定。如果 conan install 用的是 -s compiler=gcc -s compiler.version=11,但 CMake 实际调用的是 clang,fmt::fmt 目标虽然能 find 到,链接时大概率报 undefined reference 或 ABI 不兼容。
典型表现:CMake 配置成功,编译也过,但链接失败,提示类似 undefined reference to `fmt::v8::printf(std::string_view, fmt::v8::format_args)'。
- 务必确保
conan install命令中的-s参数与你后续运行cmake ..时实际使用的编译器完全一致 - 使用
CMakeToolchain生成器可自动导出 toolchain 文件,并在 CMake 中用-DCMAKE_TOOLCHAIN_FILE=...加载,比手动配-s更可靠 - profile 文件(如
~/.conan2/profiles/default)会影响默认 settings,建议显式指定--profile=default避免隐式行为
为什么 target_link_libraries(... fmt::fmt) 报错 “Unknown import target”?
这个错误意味着 find_package(fmt REQUIRED CONFIG) 成功执行了,但生成的 fmtTargets.cmake 里没有定义 fmt::fmt 这个别名目标。根本原因通常是 Conan 包本身未导出 CMake 导入目标(比如旧版包或自建包未正确配置 cpp_info.set_property("cmake_target_name", ...))。
不是所有 Conan 包都默认提供 :: 命名空间目标;有些只提供 fmt(非命名空间)或 CONAN_PKG::fmt。
- 先检查生成的
fmtTargets.cmake文件内容,搜索add_library(fmt::fmt或add_library(fmt - 若只有
add_library(fmt),就改用target_link_libraries(main PRIVATE fmt) - 若看到
CONAN_PKG::fmt,则用CONAN_PKG::fmt - 优先选用官方 Conan Center 的包(如
fmt/10.2.1),它们基本都已适配标准 CMake 目标命名
conan install 的 settings 和 CMake 实际构建环境之间那层看不见的 ABI 对齐,以及 Config 模式下对 CMAKE_PREFIX_PATH 或 include() 路径的精确控制。漏掉任意一环,find_package 就只是安静地失败。

















