conanfile.py 必须声明 settings 字段,否则无法实现多平台支持;最基础四元组为 "os", "arch", "compiler", "build_type",缺一不可,漏写或错误将导致二进制混用、链接失败或运行时崩溃。

conanfile.py 必须声明 settings 字段
Conan 不会自动推断目标平台,所有平台差异(Windows/Linux/macOS、x86_64/aarch64、Debug/Release、GCC/Clang/MSVC)都靠 settings 字段显式控制。漏写或写错 settings,包就只能在默认配置下构建,根本谈不上多平台支持。
常见错误是只写 "os",却忘了 "arch"、"compiler"、"build_type" —— 这会导致不同架构的二进制包被混用,链接失败或运行时崩溃。
-
settings = "os", "arch", "compiler", "build_type"是最基础四元组,缺一不可 - 若项目不依赖 C++ 标准库 ABI(如纯 C 库),可额外加
"compiler.libcxx"来区分 libstdc++/libc++ - 交叉编译时,必须区分
settings_build(宿主机)和settings_target(目标机),Conan 2.x 中通过 profile 或--profile:build/--profile:host控制
使用 profile 而不是硬编码编译器参数
在 conan create 或 conan install 时直接用 -s compiler=gcc -s compiler.version=12 看似简单,但无法复用、难维护、易出错。真正支持多平台的方式是把编译环境抽象成 profile 文件。
比如为 ARM64 Linux 构建,新建 profiles/linux-arm64:
[settings] os=Linux arch=armv8 compiler=gcc compiler.version=12 compiler.libcxx=libstdc++11 build_type=Release
然后执行:conan create . --profile:build=default --profile:host=linux-arm64
- profile 文件可版本管理,团队共享;
conan profile list和conan profile show <name></name>可快速验证 - Windows + MSVC 需额外指定
compiler.runtime(dynamic/static),否则生成的包在不同运行时环境下无法链接 - macOS 上注意
os.version(如12.0)和os.sdk(macosx),影响 SDK 路径与符号兼容性
CMakeToolchain + CMakeDeps 是跨平台集成的关键生成器
仅靠 find_package() 在多平台下大概率失败:Windows 的 .lib 和 Linux 的 .a/.so 路径结构不同,MSVC 的运行时开关(/MD vs /MT)也需精确匹配。Conan 2.x 强制推荐用 CMakeToolchain 和 CMakeDeps 替代旧的 cmake_find_package。
在 conanfile.py 中启用:
def generate(self):
tc = CMakeToolchain(self)
tc.generate()
deps = CMakeDeps(self)
deps.generate()
-
CMakeToolchain会生成conan_toolchain.cmake,内含CMAKE_SYSTEM_NAME、CMAKE_CXX_FLAGS、运行时选项等,确保 CMake 配置与 Conansettings完全一致 -
CMakeDeps为每个依赖生成<pkg>-config.cmake</pkg>,自动处理INTERFACE_INCLUDE_DIRECTORIES、INTERFACE_LINK_LIBRARIES和绝对路径,避免手写include_directories()或link_directories() - 若仍用
find_package(XXX),必须配合set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}),否则 CMake 找不到 Conan 生成的 config 文件
二进制包上传前必须验证 platform tag
Conan 仓库中每个包都有唯一 hash ID,它由 settings 全组合计算得出。上传前不检查 tag,很可能把 x86_64 包误标为 aarch64,下游用户 conan install 时拉到错包,编译报 file format not recognized 或运行时报 Illegal instruction。
验证方式有两种:
- 本地构建后查包 ID:
conan list *:* --graph=graph.json,再打开graph.json看context和settings字段是否符合预期 - 上传前用
conan upload <ref> -r <remote> --check</remote></ref>,它会校验本地包的 settings 是否与远程 profile 策略兼容 - 私有 Artifactory 仓库可配置 “Repository Layout” 强制约束 settings 组合,防止非法包入库
多平台不是“能跑就行”,而是每个 os+arch+compiler+build_type 组合都得有对应二进制,且它们之间不能越界调用——这点最容易被忽略,尤其在 CI 流水线里用错 profile 导致混传。











