有没有办法在 macOS 10.14 中编译 x86-64 + arm64 通用二进制文件?

问题描述 投票:0回答:2

编译针对 Apple 新 M1 处理器的通用二进制文件的官方方法是使用 Xcode 12,它至少需要 macOS 10.15.4。不过,我目前运行的是 macOS 10.14.6,如果可以避免的话,我不想升级。在运行 macOS 10.14 时是否有非官方的方法来编译这样的通用二进制文件?

macos universal-binary apple-silicon
2个回答
1
投票

这是可以做到的。当然,这不能单独使用 Xcode 来完成,因为 Apple 早已在其开发工具中放弃了对 macOS 10.14 的支持,但可以通过从命令行编译或使用其他构建系统(如 cmake 或 qmake)来完成。

它至少需要两件事:

  • 比 macOS 10.14 官方支持更新的 macOS SDK,从 Xcode 12.2 或更高版本获取
  • 较新版本的 LLVM / clang 与您获得的 Xcode 版本中的 macOS SDK 兼容

实际上,您可以通过下载最新版本的 Xcode 来获得这两件事,因为截至撰写本文时(2022 年 12 月),最新版本的 Xcode (14.2) 中包含的 LLVM 版本仍将在 macOS 10.14 中运行。

如果它停止工作,或者如果您不想使用 Xcode 的 LLVM 版本,您还可以安装较新版本的 LLVM 并使用 MacPorts 进行 clang,因为 MacPorts 继续支持旧版 macOS 版本(与 Homebrew 不同)。该命令将是

sudo port install clang-15
,或者 clang 的最新可用主要版本是什么。

另一种选择是构建并安装您自己的 LLVM 和 clang 副本,LLVM 文档中列出了执行此操作的步骤。

为了获得最佳结果,LLVM 的版本应与您获得的 Xcode 版本中包含的 LLVM / clang 版本相同或更新。

一旦你拥有了这两个,你就可以使用如下命令编译 C、C++ 或 Objective-C 甚至 Swift:

/path/to/newer/clang \
    -arch x86_64 -arch arm64 \
    -isysroot /path/to/Xcode14.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
    source.m source2.cpp source3.c ...

如果您使用 MacPorts 安装 clang,那么它的路径将类似于

/opt/local/bin/clang-mp-15

如果仅使用较新版本的 Xcode,您可以这样做:

/path/to/Xcode14.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang \
    -arch x86_64 -arch arm64 \
    -isysroot /path/to/Xcode14.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
    source.m source2.cpp source3.c ...

到目前为止,我只用 C、C++ 和 Objective-C 测试过这个,没有用 Swift,但想必它也适用于 Swift。

请注意,如果您想以 macOS 10.14 为目标,仍然需要避免使用部分 macOS SDK 以及需要 macOS 10.15 或更高版本的 C++ 和 Swift 功能。

(如果您从 LLVM 的更高版本构建自己的 LLVM 运行时通用二进制文件(即 libc++ 和 libc++abi),然后编译您的 macOS 10.14 及更早版本,那么至少可以利用 macOS 10.14 及更早版本中的较新 C++ 功能使用参数

-nostdlib
编写代码,静态链接到 libc++ 和 libc++abi,然后显式链接到
/usr/lib/libSystem.B.dylib
。但到目前为止,我还没有设法获得 LLVM 运行时的
arm64
副本以在 macOS 10.14 中进行编译。 .)


-4
投票

简短回答:否

为什么? 苹果做到了。有一个来自苹果的文档这里

您必须使用 Xcode 12.2 及更高版本。您必须升级到 MacOS 10.15.4+ 或 11 才能使用最新功能。 Apple 推出了工具

lipo
来转换 ARM64 和 AMD64 架构的二进制文件。

使用 Apple 芯片,您可以编译适用于 ARM64 和 AMD64 的二进制文件。您可以自然地调试 ARM64 二进制文件。您可以在 Rosetta 翻译下调试 AMD64 二进制文件。

使用 Intel x86 芯片,您可以编译适用于 ARM64 和 AMD64 的二进制文件。您可以自然地调试 AMD64 二进制文件。但您无法在 Rosetta 翻译下调试 ARM64 二进制文件。

这意味着 Apple Silicon 的 ARM64 架构可以在 MacOS 上做更多事情。这对于AMD64芯片来说是不公平的。典型的苹果。希望有人能出来揭开苹果芯片的秘密。但我认为苹果不愿意分享。如果 Intel/AMD 醒来并为我们带来更强大的芯片,可以为 MacOS 编译/调试 ARM64 二进制文件,苹果将不会对其销售感到满意。从长远来看,我们将无法做到这一点(看起来)。苹果几年前就踢出了英伟达,现在是英特尔,很快又是AMD。在这里标记一下。 10年后,让我们拭目以待。

© www.soinside.com 2019 - 2024. All rights reserved.