Conan在macOS上如何处理x86与arm64通用(Universal)构建?
在macOS上用Conan构建Universal(Fat)二进制文件
核心机制说明
Conan本身不直接生成fat二进制,而是先为每个目标架构单独编译依赖,再借助macOS系统的lipo工具合并多架构二进制。Conan 2.x对Universal构建做了集成支持,1.x版本则需要手动或脚本辅助完成合并。
Conan 2.x 实现步骤
配置多架构构建
可以通过profile文件或命令行参数指定要构建的架构:
- Profile方式:创建或修改Conan profile文件(比如
universal.profile):
执行安装命令时指定该profile:[settings] os=Macos arch=armv8, x86_64conan install . --profile=universal.profile --build=missing - 命令行直接指定:
conan install . --settings os=Macos --settings arch=armv8,x86_64 --build=missing
项目构建配置
如果是CMake项目,需要在CMakeLists.txt中明确指定通用架构,确保最终应用也生成fat二进制:
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE)
验证结果
构建完成后,用lipo命令检查生成的库或可执行文件:
lipo -info path/to/your/library.dylib
正常输出会包含arm64和x86_64两种架构标识。
Conan 1.x 实现步骤
1.x版本没有原生多架构合并支持,需要分三步操作:
- 分别编译不同架构的依赖
先编译arm64版本:
再编译x86_64版本(M1机器上会自动用Rosetta 2转译):conan install . -s os=Macos -s arch=armv8 --build=missingconan install . -s os=Macos -s arch=x86_64 --build=missing - 手动合并二进制
用lipo工具逐个合并依赖库,示例:
可以编写Shell脚本批量处理所有依赖文件。lipo -create ./build-arm64/lib/libfoo.dylib ./build-x86_64/lib/libfoo.dylib -output ./build-universal/lib/libfoo.dylib - 项目编译配置
同样在CMakeLists.txt中设置通用架构:set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE)
关键注意事项
- 确认所有第三方依赖都支持arm64架构,部分老旧库可能需要调整编译脚本才能兼容。
- 远程仓库若无对应架构的预编译包,务必加上
--build=missing参数强制本地编译。 - M1机器上编译x86_64架构依赖时,会自动通过Rosetta 2转译,编译速度会比原生arm64慢一些。
内容的提问来源于stack exchange,提问作者Kapitan
相关产品推荐
相关产品推荐

