conan在macos上需正确配置profile(含apple-clang、libc++、os.version等)、用conan create或export-pkg生成包,并手动签名dylib;否则将出现链接失败或运行时库加载错误。

Conan 本身不“生成”二进制包,而是通过 conan create 或 conan export-pkg 将源码或已有二进制打包成 Conan 可识别、可复用的包格式;macOS 上的关键在于 profile 配置、编译器识别和签名兼容性。
macOS 上必须配置正确的 profile
Conan 默认不会自动识别 macOS 的 SDK 路径、编译器版本或 deployment target。不设 profile,conan create 很可能用错 clang 版本或链接失败。
- 运行
conan profile detect --force通常能生成基础 profile,但需手动检查:conan profile show default - 重点确认以下字段是否合理:
-
compiler=apple-clang(不是clang) -
compiler.version应与xcode-select -p和clang --version一致(如15.0) -
compiler.libcxx=libc++(macOS 默认 C++ 标准库) -
os.version=14.0或更高(对应你目标最低部署版本,影响-mmacosx-version-min)
-
- 若使用 Homebrew 安装的 cmake/clang,profile 中
compiler.path可能需要显式指定,否则 Conan 可能调用 Xcode 自带工具链导致头文件路径错乱
用 conan create 构建源码并生成 macOS 二进制包
这是最常见方式:从源码出发,Conan 控制整个构建流程,最终产出平台/配置专属的二进制包。
- 确保
conanfile.py中定义了settings = "os", "arch", "compiler", "build_type",且未硬编码 Linux/Windows 路径逻辑 - 在 macOS 上执行:
conan create . --name=mylib --version=1.0.0 - 实际构建时会触发:
- 下载依赖(如
poco/1.12.2)并匹配当前 profile 的二进制(若存在) - 调用 CMake(或 autotools 等)编译源码,传入
-DCMAKE_OSX_DEPLOYMENT_TARGET=14.0等参数 - 将产物(
.a/.dylib)、头文件、cmake config 文件打包进本地缓存
- 下载依赖(如
- 生成的包 ID 会包含
apple-clang-15.0-libc++-x86_64-Release这类标识,不可跨平台复用
用 conan export-pkg 打包已编译的 macOS 二进制
适用于你已有预编译好的 .dylib 或 .a,不想再跑一遍构建流程(比如第三方闭源 SDK)。
- 目录结构示例:
mylib/ ├── conanfile.py ├── include/ │ └── mylib.h └── lib/ └── libmylib.dylib -
conanfile.py中需禁用build(),只实现package()方法,用self.copy("*.dylib", dst="lib")显式声明要打包的文件 - 执行:
conan export-pkg . mylib/1.0.0@ --profile=default(必须指定 profile,否则无法标记平台属性) - 注意:如果 dylib 含有绝对路径依赖(
otool -L libmylib.dylib显示/usr/local/lib/xxx),需用install_name_tool -change重写,否则下游链接会失败
签名与公证(发布前必做)
macOS 上未签名的 dylib 或可执行文件,在启用 Gatekeeper 的系统中默认被拒载;Conan 不处理签名,这一步必须手动补上。
- 对生成的 dylib 签名:
codesign --force --sign "Developer ID Application: XXX" ~/.conan2/p/mylib/1.0.0/_/_/package/xxx/lib/libmylib.dylib - 若包内含可执行文件(如 CLI 工具),同样需签名
- 上传到 App Store 或分发给终端用户前,还需通过 Apple Notary Service 公证;Conan 生成的包不包含公证所需元数据,需额外打包为
.zip或.pkg后提交 - 未签名的包在本地开发可用,但无法被其他团队或 CI 流水线安全拉取——很多企业级 Conan 远程库会校验签名字段
真正容易被忽略的是 profile 的 os.version 和 dylib 的 @rpath 设置:前者决定能否在旧版 macOS 运行,后者决定运行时能否找到依赖。这两项不调好,包看起来“生成成功”,一运行就报 Library not loaded。











