共用方式為


交叉編譯

跨編譯是指為與編譯器運行所在平台不同的平台創建可執行程序碼的過程。 平台差異可能是不同的OS或不同的架構。 例如,從Linux編譯 Windows,或從 x64 編譯 Arm64。 在 Linux 上,差異也可能出現在標準 C 函式庫的實作上,例如使用 "glibc"(如 Ubuntu Linux)或 "musl"(如 Alpine Linux)。

原生 AOT 使用平臺工具(連結器)將平台連結庫(靜態和動態)與 AOT 編譯的 Managed 程式代碼連結至最終可執行檔。 目標系統的跨連結器和靜態/動態連結庫的可用性會限制可跨編譯的OS/架構組。

由於沒有標準化的方式可取得原生 macOS SDK 以用於 Windows/Linux,或用於 Linux/macOS 的 Windows SDK,或用於 Windows/macOS 的 Linux SDK, 原生 AOT 不支援跨 OS 編譯。 使用原生 AOT 的跨 OS 編譯需要某種形式的模擬,例如虛擬機或 Windows WSL。

不過,原生 AOT 對 跨架構 編譯的支援有限。 只要安裝必要的原生工具鏈,就可以在 Windows、Mac 或 Linux 上跨架構x64arm64之間交叉編譯。

窗戶

只要安裝適當的 VS 2022 C++建置工具,從 x64 Windows 交叉編譯到 ARM64 Windows 或從 ARM64 Windows 到 x64 Windows 都有效。 若要以 ARM64 為目標,請確定已安裝 Visual Studio 元件“VS 2022 C++ ARM64/ARM64EC建置工具 (Latest)”。 若要以 x64 為目標,請尋找「VS 2022 C++ x64/x86 建置工具 (最新)」。

Mac(蘋果電腦)

MacOS 會在預設 XCode 安裝中提供 x64 和 amd64 工具鏈。

Linux

每個 Linux 發行版都有不同的系統來安裝原生工具鏈相依性。 請參閱 Linux 發行版的檔,以判斷必要的步驟。

必要的相依性如下:

  • 交叉連結器,或可針對目標發出的連結器。 clang 是這類連結器之一。
  • 如果您的專案已啟用了 objcopy,則需要目標相容的 stripStripSymbols
  • 針對目標架構的 C 執行時期物件檔案。
  • 目標架構的 zlib 物件檔。

下列命令可能足以在Ubuntu 22.04 amd64上編譯 linux-arm64 ,但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