如何在x86_64 Mac上为M1 Mac构建Rust通用二进制程序?
问题描述
尝试为 macOS 构建 Rust 程序,目标生成支持 x86_64(Intel)和 arm64(M1)的通用二进制文件:
- 已通过 xcodebuild 将 SDL 编译为通用二进制,库信息如下:
libSDL2.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit x86_64 dynamically linked shared library, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|NO_REEXPORTED_DYLIBS>] [arm64] libSDL2_image.a: Mach-O universal binary with 2 architectures: [arm64:current ar archive random library] [x86_64:current ar archive random library] libSDL2_ttf.a: Mach-O universal binary with 2 architectures: [arm64:current ar archive] [x86_64]
- x86_64-apple-darwin 版本构建成功,但 aarch64-apple-darwin 版本构建失败,clang 误判为针对 iOS 构建,导致无法链接 SDL 库及 macOS 系统框架。
- 当前 Cargo.toml 配置:
[target.x86_64-apple-darwin] ar = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar" linker = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" rustflags = ["-L$WORKSPACE/target/libs", "-L$WORKSPACE/target/sdk/usr/lib", "-Clink-arg=--target=x86_64-apple-darwin", "-Clink-arg=-Wl,-F$WORKSPACE/target/sdk/System/Library/Frameworks,-F/System/Library/Frameworks,-framework,CoreAudio,-framework,CoreFoundation,-framework,CoreGraphics,-framework,ImageIO,-framework,CoreServices"] [target.aarch64-apple-darwin] ar = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar" linker = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" rustflags = ["-L$WORKSPACE/target/libs", "-L$WORKSPACE/target/sdk/usr/lib", "-Clink-arg=--target=aarch64-apple-darwin", "-Clink-arg=-Wl,-F$WORKSPACE/target/sdk/System/Library/Frameworks,-F/System/Library/Frameworks,-framework,CoreAudio,-framework,CoreFoundation,-framework,CoreGraphics,-framework,ImageIO,-framework,CoreServices"]
$WORKSPACE 会由构建脚本通过 sed 替换为实际路径。
- 错误信息:
= note: ld: warning: building for iOS, but linking in dylib file (/Users/runner/work/catgirl-engine/catgirl-engine/target/libs/libSDL2.dylib) built for macOS ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/usr/lib/libiconv.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/usr/lib/libm.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/System/Library/Frameworks/CoreAudio.framework/CoreAudio.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/usr/lib/libSystem.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/usr/lib/libc.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/System/Library/Frameworks/ImageIO.framework/ImageIO.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics.tbd) built for macOS/Mac Catalyst ld: warning: building for iOS, but linking in .tbd file (/Users/runner/work/catgirl-engine/catgirl-engine/target/sdk/System/Library/Frameworks/CoreServices.framework/CoreServices.tbd) built for macOS/Mac Catalyst ld: building for iOS, but linking in object file built for macOS, file '/Users/runner/work/catgirl-engine/catgirl-engine/target/aarch64-apple-darwin/release/deps/catgirl_engine-c308cec5d59a8390.catgirl_engine.065dccbf-cgu.7.rcgu.o' for architecture arm64
修复方案
问题根源是 aarch64-apple-darwin 目标三元组未明确指定平台为 macOS,导致 clang 默认按 iOS 处理。按以下方式修改配置:
1. 修改 Cargo.toml 的 aarch64 目标配置
更新 [target.aarch64-apple-darwin] 下的 rustflags,明确指定 macOS 目标版本并绑定正确的 SDK:
[target.aarch64-apple-darwin] ar = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar" linker = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" rustflags = [ "-L$WORKSPACE/target/libs", "-L$WORKSPACE/target/sdk/usr/lib", # 明确指定 macOS 目标架构(带版本号,可根据最低支持版本调整) "-Clink-arg=--target=aarch64-apple-macos11.0", # 指定最低支持的 macOS 版本 "-Clink-arg=-mmacosx-version-min=11.0", # 绑定 macOS SDK 路径,避免 clang 误用其他 SDK "-Clink-arg=-sysroot=$(xcrun --sdk macosx --show-sdk-path)", "-Clink-arg=-Wl,-F$WORKSPACE/target/sdk/System/Library/Frameworks,-F/System/Library/Frameworks,-framework,CoreAudio,-framework,CoreFoundation,-framework,CoreGraphics,-framework,ImageIO,-framework,CoreServices" ]
注:
macos11.0是 M1 设备支持的最低 macOS 版本,若需支持更早版本(比如兼容 Intel 的旧版本),可调整为对应版本号(如10.15)。
2. 验证构建并生成通用二进制
修改完成后,执行以下命令构建并合并:
# 构建 x86_64 版本 cargo build --release --target x86_64-apple-darwin # 构建 aarch64 版本 cargo build --release --target aarch64-apple-darwin # 使用 lipo 合并为通用二进制 mkdir -p target/universal/release lipo -create \ target/x86_64-apple-darwin/release/your-app \ target/aarch64-apple-darwin/release/your-app \ -output target/universal/release/your-app
替换 your-app 为实际的程序名称。
3. 可选:检查构建脚本的路径替换
确保构建脚本中 sed 替换 $WORKSPACE 时,路径正确且无转义问题,避免库或 SDK 路径错误。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

