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_SDK 是 target/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