conan在linux cmake工程中可用,但必须确保conan install生成的配置与cmake构建类型、编译器设置完全对齐;否则find_package会失败或链接出错。

Conan 在 Linux 的 CMake 工程里能用,但必须让 conan install 生成的配置和 cmake 实际执行时的构建类型、编译器设置完全对齐,否则 find_package 找不到目标、链接失败、甚至静默跳过依赖——这不是 Conan 不行,是它默认不替你做环境同步。
conanfile.txt 声明依赖时别漏掉 generators
Linux 下主流是单配置构建(Make/Ninja),CMakeDeps 和 CMakeToolchain 必须同时存在,缺一不可:
-
CMakeDeps生成fmtConfig.cmake这类文件,供find_package(fmt CONFIG REQUIRED)使用 -
CMakeToolchain生成conan_toolchain.cmake,统一CMAKE_CXX_STANDARD、CMAKE_BUILD_TYPE、编译器路径等,避免 CMake 自己猜错 - 只写
[generators] CMakeDeps是常见错误——CMake 会用系统默认标准(比如 C++14),而 fmt/10.2.1 要求 C++17,编译直接报错
示例 conanfile.txt:
[requires] fmt/10.2.1 spdlog/1.13.0 <p>[generators] CMakeDeps CMakeToolchain</p><p>[options] fmt:shared=False</p>
conan install 命令必须显式传 -s 设置
Linux 没有像 Windows MSVC 那样的多配置生成器,conan install 必须明确告诉 Conan 当前要构建什么环境,否则它按默认 profile(通常是 gcc 11, Release)生成配置,和你 cmake -DCMAKE_BUILD_TYPE=Debug 冲突:
- 运行前先确认你的编译器版本:
gcc --version→ 得到gcc 12.3.0,就用-s compiler.version=12.3 - 构建类型必须和 CMake 一致:
-s build_type=Debug对应cmake -DCMAKE_BUILD_TYPE=Debug - 别信“自动检测”:Conan 不读取
CMAKE_BUILD_TYPE,它只认自己的-s
正确命令示例(在 build/ 目录中执行):
conan install .. --build=missing -s compiler=gcc -s compiler.version=12.3 -s compiler.libcxx=libstdc++11 -s build_type=Debug
CMakeLists.txt 中 include conan_toolchain.cmake 的位置很关键
这个 include() 必须放在 project() 之后、任何 add_executable() 或 find_package() 之前,否则变量覆盖失效或 find_package 查找不到路径:
- 错误写法:
include()放在cmake_minimum_required()后面 →CMAKE_CXX_STANDARD还没被 project 初始化,toolchain 里的设置无效 - 正确顺序:先
project()触发 CMake 初始化,再include(conan_toolchain.cmake)覆盖关键变量,最后声明目标 - 路径要写对:Conan 默认生成在
build/generators/conan_toolchain.cmake,不是build/conan_toolchain.cmake
片段示例:
cmake_minimum_required(VERSION 3.15)
project(hello LANGUAGES CXX)
<h1>必须在 project() 之后、find_package() 之前</h1><p>include(${CMAKE_CURRENT_LIST_DIR}/build/generators/conan_toolchain.cmake)</p><p>set(CMAKE_CXX_STANDARD 17)
find_package(fmt CONFIG REQUIRED)
add_executable(hello src/main.cpp)
target_link_libraries(hello PRIVATE fmt::fmt)</p>
Debug/Release 不一致时最常踩的坑是库 ABI 不兼容
Linux 下 build_type=Debug 和 build_type=Release 生成的库二进制不兼容,尤其涉及 STL 容器(std::string, std::vector)时。如果你在 Debug 构建中链接了 Release 版的 spdlog,程序大概率在 spdlog::logger::log 处崩溃,错误信息可能只显示 double free or corruption,不提 Conan 或 spdlog。
- 验证方式:
readelf -d build/generators/xxx/libspdlog.so | grep NEEDED看是否混用了libstdc++.so.6和libstdc++_debug.so.6 - 根因:
conan install时没传-s build_type=Debug,却用cmake -DCMAKE_BUILD_TYPE=Debug编译主项目 → 主项目用 debug STL,依赖用 release STL - 解决:所有构建都走同一套
-s,且确保compiler.libcxx一致(libstdc++11或libstdc++,别混用)
真正麻烦的不是配不通,而是配通了但 Debug 和 Release 行为不一致——这种问题往往拖到集成测试才暴露,而且堆栈看不出源头。











