必须在cmake configure前执行conan install,它生成cmakedeps和cmaketoolchain文件,为find_package和target_link_libraries提供头文件路径、链接选项及编译定义;输出目录需与cmake -b指定目录一致,且须通过cmake_toolchain_file和cmake_prefix_path正确引入生成文件。

conan install 必须在 cmake configure 之前执行
conan install 不是“装完就完”,它生成的 CMakeDeps 和 CMakeToolchain 文件,是 CMake 能正确找到头文件路径、链接选项、编译定义的前提。如果跳过这步或顺序颠倒,CMake 会报 find_package(fmt REQUIRED) could not find 或 target_link_libraries() given no target。
-
conan install的输出目录(如build/)必须和后续cmake -S . -B build的-B目录一致 - 若用
--output-folder=build,则 CMake 必须从项目根目录运行:cmake -S . -B build,不能进到build/再cmake .. -
conan install默认不生成构建产物,只生成配置;它不调用cmake --build,那是你自己的事
CMakeLists.txt 里怎么接入 Conan 生成的配置
关键不是“加一行命令”,而是让 CMake 主动读取 Conan 输出的两个核心文件:toolchain(控制编译器/标准/架构)和 deps(提供 find_package 支持)。现代写法(Conan 2.x + CMake ≥ 3.23)只需两处改动:
- 在
project()之前 加上:cmake_minimum_required(VERSION 3.23) set(CMAKE_TOOLCHAIN_FILE $ENV{PWD}/build/conan_toolchain.cmake CACHE STRING "") - 在
find_package()之前确保已加载CMakeDeps生成的*-config.cmake,通常靠include($ENV{PWD}/build/xxx-config.cmake)或更稳妥地——把build/加入CMAKE_PREFIX_PATH:list(APPEND CMAKE_PREFIX_PATH "$ENV{PWD}/build")
否则即使 conan install 成功,find_package(fmt) 仍会失败,因为 CMake 根本没去 build/ 下找配置。
为什么 --build=missing 经常卡住或编译失败
这不是 Conan 本身的问题,而是它暴露了你环境的真实约束:
-
--build=missing意味着:若远程没有匹配你settings(如compiler.version=14,build_type=Debug)的二进制,就现场源码编译 - 很多包(如
openssl,libpq)依赖 Perl/Python/NASM 等构建工具,它们不在 PATH 中就会静默失败 - 某些包(如
nanopb)要求先有protoc和 nanopb 插件,而 Conan 不自动帮你装 protoc —— 它只管包内逻辑,不管 host 工具链
常见应对方式:
- 先运行
conan remote list确认默认远程是@#@#@#@#@#@#@#@#@#@0(ConanCenter v2) - 用
conan search fmt --remote=center查是否有你平台的预编译包 - 如果只想跳过编译,改用
--build=never,但要接受“找不到包就报错”的现实
profile 不配好,整个依赖图就错位
Conan 的 settings(os/arch/compiler/build_type)决定 package ID,也决定 CMake 最终用什么参数跑。如果你本地 profile 是 GCC 11 Release,但 CMake 命令里传了 -DCMAKE_BUILD_TYPE=Debug,两者 mismatch,CMake 可能链接到 Release 版的库却用 Debug 宏编译你的代码,结果是 std::string ABI 不兼容、assert() 行为异常、甚至段错误。
- 运行
conan profile detect自动生成基础 profile,再手动检查~/.conan2/profiles/default是否符合你当前终端环境 - 构建时显式指定:
conan install . -pr:h=default -if=build --build=missing,避免隐式 fallback - 多配置生成(如 MSVC 的 Debug/Release 混合)必须配合
--config Debug和conan install阶段的-s build_type=Debug严格对齐
真正容易被忽略的点是:Conan 不会替你校验 CMake 和 host 编译器是否真能协同工作。它只保证“我给的参数你收到了”,至于你拿这些参数干了什么,它不管。











