跳转至

Linux 交叉编译 macOS

使用 tpoechtrager/osxcross 实现。

安装

根据文档上的要求,安装基本工具。python-is-python3 是让 python 指向 python3

sudo apt update
sudo apt install clang cmake git patch python-is-python3 \
    libssl-dev lzma-dev libxml2-dev xz-utils \
    bzip2 cpio zlib1g-dev bash

clone osxcross 仓库。

git clone https://github.com/tpoechtrager/osxcross.git
cd osxcross

打包 macOS SDK

根据 osxcross 文档上 PACKAGING THE SDK 的方法来做,挺麻烦的。可以直接用别人打包好的

我使用的是 MacOSX15.1.sdk.tar.xz,下载后放到 osxcross/tarballs 目录里。

构建

osxcross 目录执行

./build.sh

构建成功后会生成 target 目录

target/
├── bin
├── include
├── lib
├── libexec
├── SDK
├── share
└── toolchain.cmake

在 CMake 中使用

根据工具版本和目标架构设置环境变量。可以打开 toolchain.cmake 看这些环境变量是怎么被使用的。OSXCROSS_SDKtarget/SDK 目录下的某个子目录名。

export OSXCROSS_HOST=arm64-apple-darwin24.1
export OSXCROSS_TARGET_DIR=/home/stalo/workspace/osxcross/target
export OSXCROSS_TARGET=darwin24.1
export OSXCROSS_SDK=MacOSX15.1.sdk

使用 cmake 时指定 toolchain.cmake

-DCMAKE_TOOLCHAIN_FILE=/home/stalo/workspace/osxcross/target/toolchain.cmake

如果要从前面的 arm64 切到 x86_64,记得重新设置环境变量。

export OSXCROSS_HOST=x86_64-apple-darwin24.1

最后,可以用 lipo 把两个架构的输出捆绑为一个。

lipo -create arm64/mylib.dylib x86/mylib.dylib -output mylib.dylib

参考