conan 通过显式 settings 键值对区分 gcc 和 clang:compiler=gcc 与 compiler=clang 被视为完全不同的构建配置,配合 compiler.version、compiler.libcxx(如 libstdc++11/libc++)等参数共同唯一标识 abi 兼容的二进制包,避免混用导致链接或运行时错误。

Conan 的 settings 是怎么区分 GCC 和 Clang 的
Conan 不靠猜,而是靠显式声明。同一个库(比如 openssl/3.1.3)在 GCC 12 和 Clang 16 下生成的二进制是完全不同的,ABI、符号导出、STL 兼容性都可能不一致。Conan 用 settings 这组键值对来唯一标识构建环境:compiler=gcc、compiler.version=12、compiler.libcxx=libstdc++11 就和 compiler=clang、compiler.version=16、compiler.libcxx=libc++ 视为两个独立的二进制配置。
你执行 conan install 时传的 -s 参数,就是在告诉 Conan:“我要这个组合下的二进制”。漏掉任何一个 settings 项(比如忘了 compiler.libcxx),它就可能复用错包,链接时报 undefined reference 或 runtime abort。
-
compiler.cppstd必须和你的 CMakeset(CMAKE_CXX_STANDARD 17)对齐,否则头文件里模板实例化可能不匹配 -
build_type=Debug和Release不能混用:Debug 版 OpenSSL 会带断言和调试符号,和 Release 版的 libssl.a 不兼容 - Windows 上还要加
compiler.runtime=MD/MT—— 一个用 /MD,一个用 /MT,链接直接失败
为什么 conan install 有时要 --build=missing
Conan Center 官方仓库只提供主流组合的预编译二进制(比如 x86_64 Linux + GCC 11/12/13)。如果你用的是 GCC 14、或者交叉到 armv8、或者自定义了 -march=native,Conan 查不到对应二进制,就会报 Missing prebuilt package。这时 --build=missing 强制从源码构建,但前提是你的机器上装了对应编译器且能跑通整个构建流程。
容易踩的坑:
- 没配好
profile,conan install默认用 host 环境的 compiler,结果在 x86_64 主机上误用了 arm64 工具链 - 没清缓存就换
settings,Conan 可能复用旧 build 目录里的中间产物,导致libcrypto.a里混了不同 ABI 的目标文件 - CI 中没指定
--build=missing,又没提前上传对应二进制,整个 pipeline 卡在依赖安装阶段
conanfile.txt 里写 openssl/3.1.3 就够了吗
不够。OpenSSL 本身依赖 zlib 和 perl(用于生成汇编),而 zlib 又分静态/动态、是否启用 asm 优化。Conan 会自动解析依赖图,但关键在于:这些子依赖也受 settings 约束。比如你指定了 compiler.libcxx=libstdc++11,那它拉下来的 zlib 也必须是用同一套 libcxx 编译的。
更麻烦的是,有些库(如 fmt)提供 header-only 模式,但一旦你启用了 fPIC 或 shared=True,行为就变了。所以实际项目中建议:
- 固定所有
settings,不要让 Conan “自动推断” - 用
conan lock create生成conan.lock,锁定每个依赖的具体二进制 hash,避免不同机器上解析出不同版本 - 交叉编译时,务必用
--profile:host和--profile:build分开指定目标机和构建机环境,否则perl可能被交叉编译成 arm64 二进制,根本跑不起来
CMake 里 find_package(OpenSSL) 找不到,是不是 Conan 没生效
大概率是 generators 配错了。Conan 2.x 默认不生成 FindOpenSSL.cmake,它推荐用 CMakeDeps + CMakeToolchain。如果你在 conanfile.txt 里写了 [generators] cmake_find_package,那是 Conan 1.x 的写法,Conan 2.x 会静默忽略,导致 CMake 根本收不到任何配置。
正确做法:
-
[generators] CMakeDeps CMakeToolchain—— 前者生成openssl-config.cmake,后者生成conan_toolchain.cmake - CMakeLists.txt 开头加
include("${CMAKE_BINARY_DIR}/conan_toolchain.cmake"),再find_package(OpenSSL REQUIRED) - 确保
conan install的输出目录(--output-folder)和 CMake 的CMAKE_BINARY_DIR一致,否则路径对不上
最常被忽略的一点:Conan 生成的 OpenSSL::SSL target 是大小写敏感的,写成 OpenSSL::ssl 或 openssl::SSL 都会链接失败。











