You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:32:08