M1 Mac下如何用Xcode命令行工具及make编译Intel/通用二进制?
用Make命令行编译多架构二进制(M1 Mac)
一、分别生成x86_64和arm64独立二进制
通过给编译工具指定目标架构和SDK路径,就能单独编译对应架构的二进制文件:
编译x86_64架构
直接在命令行传入编译参数:make CC="clang -arch x86_64 -isysroot $(xcrun --show-sdk-path --sdk macosx)"或者在Makefile中固定配置:
CC = clang CFLAGS = -arch x86_64 -isysroot $(shell xcrun --show-sdk-path --sdk macosx) # 项目原有编译规则,比如 mybinary: main.c $(CC) $(CFLAGS) $^ -o $@编译arm64架构
仅需把架构参数替换为arm64:
命令行方式:make CC="clang -arch arm64 -isysroot $(xcrun --show-sdk-path --sdk macosx)"Makefile配置同理,修改
CFLAGS中的-arch值即可。验证架构:编译完成后用
lipo -info <二进制文件名>查看结果。
二、生成Universal Binary(胖二进制)
有两种实现方式,按需选择:
方式1:先编译单架构版本,再合并
先分别编译两个架构的二进制,再用lipo工具合并成通用二进制:
对应的Makefile示例:
CC = clang SDK_PATH = $(shell xcrun --show-sdk-path --sdk macosx) all: mybinary-universal # 编译x86_64版本 build/x86_64/mybinary: mkdir -p build/x86_64 $(CC) -arch x86_64 -isysroot $(SDK_PATH) main.c -o $@ # 编译arm64版本 build/arm64/mybinary: mkdir -p build/arm64 $(CC) -arch arm64 -isysroot $(SDK_PATH) main.c -o $@ # 合并为通用二进制 mybinary-universal: build/x86_64/mybinary build/arm64/mybinary lipo -create $^ -output $@ clean: rm -rf build mybinary-universal
执行make即可生成通用二进制文件。
方式2:直接一次编译生成
编译时同时指定两个架构参数,clang会直接输出包含双架构的胖二进制:
命令行方式:
make CC="clang -arch x86_64 -arch arm64 -isysroot $(xcrun --show-sdk-path --sdk macosx)"
Makefile配置方式:
CC = clang CFLAGS = -arch x86_64 -arch arm64 -isysroot $(shell xcrun --show-sdk-path --sdk macosx) mybinary: main.c $(CC) $(CFLAGS) $^ -o $@
注意事项
- 确保已安装Xcode命令行工具,可通过
xcode-select --install完成安装 xcrun --show-sdk-path用于获取当前系统的macOS SDK路径,保证编译环境统一
内容的提问来源于stack exchange,提问作者gernophil
相关产品推荐
相关产品推荐

