跨平台编译

交叉编译是为运行编译器的平台以外的平台创建可执行代码的过程。 平台差异可能是不同的 OS 或不同的体系结构。 例如,从 Linux 编译 Windows,或从 x64 编译 Arm64。 在 Linux 上,标准 C 库实现(例如 glibc(例如 Ubuntu Linux)或 musl(例如 Alpine Linux)之间也可能有所不同。

AOT 本机模式使用平台工具(链接器)将平台库(静态和动态)与 AOT 编译的托管代码链接为最终的可执行文件。 目标系统中交叉编译器和静态/动态库的可用性会限制可以进行交叉编译的操作系统/体系结构对。

由于没有标准化的方法来获取用于 Windows/Linux 的本机 macOS SDK、用于 Linux/macOS 的 Windows SDK 或用于 Windows/macOS 的 Linux SDK,因此本机 AOT 不支持跨操作系统的编译。 使用本地化 AOT 进行跨操作系统编译需要某种形式的仿真,例如虚拟机或 Windows WSL。

但是,本机 AOT 对 跨体系结构 编译的支持有限。 只要安装了必要的本机工具链,就可以在 Windows、Mac 或 Linux 上的体系结构之间x64arm64交叉编译。

Windows操作系统

从 x64 Windows 交叉编译到 ARM64 Windows,反之亦然,前提是安装了适当的 VS 2022 C++生成工具。 若要以 ARM64 为目标,请确保已安装 Visual Studio 组件“VS 2022 C++ ARM64/ARM64EC生成工具(最新)”。 若要面向 x64,请改为查找“VS 2022 C++ x64/x86 生成工具(最新)”。

Mac

MacOS 在默认 XCode 安装中提供 x64 和 amd64 工具链。

Linux的

每个 Linux 分发版都有一个不同的系统用于安装本机工具链依赖项。 请参阅 Linux 分发版的文档以确定必要的步骤。

必要的依赖项包括:

  • 交叉链接器,或可为目标发出的链接器。 clang 是一个这样的链接器。
  • 目标兼容objcopystrip,如果为项目启用了StripSymbols
  • 目标体系结构的 C 运行时的对象文件。
  • 目标体系结构的 zlib 的对象文件。

以下命令可能足以用于 linux-arm64 Ubuntu 22.04 amd64 的编译,尽管 Ubuntu 未记录或保证这一点。

sudo dpkg --add-architecture arm64
sudo bash -c 'cat > /etc/apt/sources.list.d/arm64.list <<EOF
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-backports main restricted universe multiverse
EOF'
sudo sed -i -e 's/deb http/deb [arch=amd64] http/g' /etc/apt/sources.list
sudo sed -i -e 's/deb mirror/deb [arch=amd64] mirror/g' /etc/apt/sources.list
sudo apt update
sudo apt install -y clang llvm binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu zlib1g-dev:arm64