conan 在 linux 上生成二进制包本质是显式声明 os=linux 等 settings 并在 linux 环境执行 conan create(有源码)或 conan export-pkg(有预编译库),确保 package id 准确反映 abi;需特别注意 compiler.libcxx、fpic 及 cmake_build_type 与 build_type 严格对齐,避免链接失败或 abi 不兼容。

Conan 为 Linux 生成二进制包,本质是让 conan create 或 conan export-pkg 在 Linux 环境中执行构建,并确保 settings 正确声明目标平台 —— 不是“跨平台生成”,而是“在 Linux 上生成 Linux 包”。
Linux 构建必须显式指定 os=Linux 和对应编译器
Conan 不会自动探测宿主机系统并默认用它作为包目标;它依赖 settings 显式声明。如果你在 Linux 机器上运行 conan create 却没设 os,它可能沿用 profile 默认值(比如 Windows),导致 package ID 错误、链接失败或找不到头文件。
正确做法是:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 用
--settings os=Linux显式覆盖(推荐用于单次命令) - 或修改 host profile(如
~/.conan2/profiles/default),确保含[settings]下有os=Linux、arch=x86_64、compiler=gcc、compiler.version=12、compiler.libcxx=libstdc++11等完整组合 - 特别注意
compiler.libcxx:GCC 11+ 默认用libstdc++11,若漏写会导致与依赖(如fmt)ABI 不兼容,出现 undefined reference
conan create vs conan export-pkg:选哪个取决于你有没有源码
两者都可在 Linux 上生成二进制包,但触发时机和产物来源完全不同:
-
conan create:适用于有源码的项目。它会依次执行source()→build()→package()。CMake 构建时需确保CMAKE_BUILD_TYPE与build_type=Release(或Debug)一致,否则生成的.a/.so会被打到错误的 package ID 下 -
conan export-pkg:适用于已有本地编译好的库(如供应商只给了include/和lib/libfoo.a)。你跳过 build 阶段,直接把文件复制进包缓存:conan export-pkg . foo/1.0@ -f="build/linux-gcc12-release" --settings os=Linux --settings compiler=gcc --settings compiler.version=12 --settings build_type=Release - 关键区别:
export-pkg不校验conanfile.py中的build()方法,但要求你手动保证package()路径与实际文件位置匹配(例如self.copy("*.a", dst="lib")必须能真实找到文件)
Linux 下动态库符号可见性与 fPIC 是高频翻车点
在 Linux 上生成共享库(.so)时,若被其他 Conan 包依赖,必须确保其目标支持位置无关代码;否则下游链接会失败,报错类似 relocation R_X86_64_32 against `.rodata' can not be used when making a shared object。
- 在
CMakeLists.txt中,对所有要导出为SHARED的库,加set_property(TARGET xxx PROPERTY POSITION_INDEPENDENT_CODE ON) - 在
conanfile.py的options中建议加入"fPIC": [True, False],并在configure()中根据self.options.fPIC控制 CMake 变量(如-DFPIC=ON) - 如果用
conan export-pkg打包预编译.so,请先用readelf -d libxxx.so | grep TEXTREL检查是否含TEXTREL条目 —— 有则说明不是真正 PIC,不能安全被其他共享库链接
生成的包 ID 必须反映真实 ABI,否则依赖图会断裂
Linux 上一个看似微小的 settings 差异(比如 compiler.libcxx=libstdc++ vs libstdc++11),会让 Conan 认为这是两个完全不同的二进制,即使文件名一样。下游项目 conan install 时若 settings 不严格匹配,就会触发 --build=missing 重编,或直接报 Missing prebuilt package。
- 验证方式:运行
conan list *:* --graph=file.json后打开 JSON,检查每个节点的package_id是否一致;不一致就回溯settings差异 - 常见陷阱:CI 脚本里用
conan install时传了--settings build_type=Debug,但conan create时没传,导致 Debug 版本根本没生成 - 最稳妥的做法:所有构建命令统一基于 profile 文件(如
linux-gcc12-release),避免零散--settings拼写错误










