本文档介绍如何在 macOS 上配置交叉编译环境,以便使用 Native AOT 编译生成 Linux 和 Windows 可执行文件。
交叉编译是指在一个平台(如 macOS)上编译生成另一个平台(如 Linux 或 Windows)的可执行文件。
.NET Native AOT 编译需要目标平台的本机链接器才能生成最终的可执行文件。这意味着:
- 在 macOS 上编译 Linux 目标需要 Linux 兼容的链接器
- 在 macOS 上编译 Windows 目标需要 Windows PE/COFF 链接器
| 目标平台 | 所需工具 | 用途 |
|---|---|---|
| Linux | Zig | C 编译器和链接器 |
| Windows | LLD (lld-link) | PE/COFF 链接器 |
| Windows | xwin | Windows SDK 下载工具 |
| Windows | Windows SDK | CRT 和系统库 |
| (可选) | LLVM objcopy | 符号剥离 |
要从 macOS 交叉编译到 Linux,我们使用 Zig 作为 C 编译器和链接器。Zig 内置了完整的交叉编译支持,包含 Linux 系统的 libc。
使用 Homebrew 安装:
brew install zig或者从官网下载:https://ziglang.org/download/
zig version应该输出类似 0.11.0 或更高版本。
用于符号剥离,可以减小可执行文件大小:
brew install llvm安装后,需要将 LLVM 添加到 PATH:
# Apple Silicon Mac
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
# Intel Mac
export PATH="/usr/local/opt/llvm/bin:$PATH"插件会自动生成一个 Zig wrapper 脚本,将其作为 C 编译器传递给 .NET AOT 编译器。脚本会:
- 过滤不兼容的链接器参数(如
-pie、-fuse-ld=bfd) - 设置正确的目标三元组(如
x86_64-linux-gnu) - 调用 Zig 进行编译和链接
从 macOS 交叉编译到 Windows 需要更多的设置,包括 LLD 链接器、xwin 工具和 Windows SDK。
LLD 是 LLVM 项目的链接器,支持 Windows PE/COFF 格式:
brew install lld安装后,将 lld-link 添加到 PATH:
# Apple Silicon Mac
export PATH="/opt/homebrew/opt/lld/bin:$PATH"
# Intel Mac
export PATH="/usr/local/opt/lld/bin:$PATH"验证安装:
lld-link --versionxwin 是一个用于下载和管理 Windows SDK 的工具,使用 Rust 编写:
# 首先确保已安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 安装 xwin
cargo install --locked xwin验证安装:
xwin --version使用 xwin 下载 Windows SDK 和 CRT 库(约 500MB):
xwin splat --output ~/.local/share/xwin-sdk这会下载并解压 Windows SDK 到指定目录。
检查 SDK 是否正确安装:
ls ~/.local/share/xwin-sdk/splat/crt应该看到 lib 目录和其他文件。
插件会:
- 使用 lld-link 作为链接器
- 配置正确的库搜索路径指向 Windows SDK
- 设置必要的链接器参数
macOS 的包管理器,大部分工具都通过它安装:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装后,根据提示将 Homebrew 添加到 PATH。
xwin 是用 Rust 编写的,需要先安装 Rust 工具链:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh按照提示完成安装后,重新打开终端或运行:
source ~/.cargo/env如果尚未安装 .NET SDK:
brew install dotnet-sdk或从官网下载:https://dotnet.microsoft.com/download
确保 Homebrew 的 bin 目录在 PATH 中:
# Apple Silicon
export PATH="/opt/homebrew/bin:$PATH"
# Intel Mac
export PATH="/usr/local/bin:$PATH"这通常由插件自动处理。如果仍然出现,请确保使用最新版本的插件。
将 LLD 添加到 PATH:
# Apple Silicon
export PATH="/opt/homebrew/opt/lld/bin:$PATH"
# Intel Mac
export PATH="/usr/local/opt/lld/bin:$PATH"确保 Rust 已正确安装并添加到 PATH:
source ~/.cargo/env检查网络连接。如果在中国大陆,可能需要使用代理:
export https_proxy=http://your-proxy:port
xwin splat --output ~/.local/share/xwin-sdk确保 SDK 已下载到正确位置。可以在插件设置中自定义路径:
{
"dotnetDeploy.crossCompile.xwinSdkPath": "~/.local/share/xwin-sdk"
}这是 macOS 系统库错误,请确保:
- 已安装 Xcode Command Line Tools:
xcode-select --install - 使用正确的目标运行时
Windows 目标链接错误,请确保:
- Windows SDK 已正确下载
- SDK 路径配置正确
在 VS Code 设置中可以自定义以下选项:
{
// 启用交叉编译
"dotnetDeploy.crossCompile.enabled": true,
// 自定义 Zig 路径
"dotnetDeploy.crossCompile.zigPath": "",
// Windows SDK 缓存路径
"dotnetDeploy.crossCompile.xwinSdkPath": "~/.local/share/xwin-sdk",
// 自动安装缺失工具
"dotnetDeploy.crossCompile.autoInstallTools": false
}如果您希望手动运行一键安装,可以使用以下脚本:
#!/bin/bash
# install-linux-toolchain.sh
echo "Installing Linux cross-compile toolchain..."
# Install Homebrew if not present
if ! command -v brew &> /dev/null; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# Install Zig
brew install zig
# Install LLVM (optional, for objcopy)
brew install llvm
echo "✓ Linux toolchain installed successfully!"
echo "Please restart your terminal or run: source ~/.zshrc"#!/bin/bash
# install-windows-toolchain.sh
echo "Installing Windows cross-compile toolchain..."
# Install Homebrew if not present
if ! command -v brew &> /dev/null; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# Install LLD
brew install lld
# Install Rust if not present
if ! command -v cargo &> /dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source ~/.cargo/env
fi
# Install xwin
cargo install --locked xwin
# Download Windows SDK
xwin splat --output ~/.local/share/xwin-sdk
echo "✓ Windows toolchain installed successfully!"
echo "Please add to your PATH:"
echo ' export PATH="/opt/homebrew/opt/lld/bin:$PATH" # Apple Silicon'
echo ' export PATH="/usr/local/opt/lld/bin:$PATH" # Intel Mac'如有问题,请在 VS Code 中查看输出面板 (View > Output > .NET Deploy) 获取详细日志。