クロスコンパイル

クロスコンパイルは、コンパイラが実行されているプラットフォーム以外のプラットフォームの実行可能コードを作成するプロセスです。 プラットフォームの違いは、異なる OS または別のアーキテクチャである可能性があります。 たとえば、Linux から Windows 用にコンパイルする場合や、x64 から Arm64 用にコンパイルする場合などです。 Linux では、標準の C ライブラリ実装 (glibc (Ubuntu Linux など) または musl (Alpine Linux など) との違いもあります。

ネイティブ AOT では、プラットフォーム ツール (リンカー) を使用して、プラットフォーム ライブラリ (静的および動的) と AOT コンパイルマネージド コードを最終的な実行可能ファイルにリンクします。 ターゲット システムに対してクロス リンカーと静的/動的ライブラリを使用できるかどうかによって、クロスコンパイルできる OS/アーキテクチャ ペアが制限されます。

Windows/Linux で使用するネイティブ macOS SDK、Linux/macOS で使用する Windows SDK、または Windows/macOS で使用する Linux SDK を取得する標準化された方法がないため、 Native AOT では OS 間コンパイルはサポートされません。 ネイティブ AOT を使用した OS 間コンパイルには、仮想マシンや Windows WSL などの何らかの形式のエミュレーションが必要です。

ただし、ネイティブ AOT では、 アーキテクチャ間 コンパイルのサポートは限られています。 必要なネイティブ ツールチェーンがインストールされている限り、 x64 と Windows、Mac、または Linux の arm64 アーキテクチャの間でクロスコンパイルできます。

ウィンドウズ

x64 Windows から ARM64 Windows またはその逆のクロスコンパイルは、適切な VS 2022 C++ ビルド ツールがインストールされている限り機能します。 ARM64 をターゲットにするには、Visual Studio コンポーネント "VS 2022 C++ ARM64/ARM64EC ビルド ツール (最新)" がインストールされていることを確認します。 x64 をターゲットにするには、代わりに "VS 2022 C++ x64/x86 ビルド ツール (最新)" を探します。

マック

MacOS では、既定の XCode インストールで x64 および arm64 ツールチェーンが提供されます。

Linux

Linux ディストリビューションごとに、ネイティブ ツールチェーンの依存関係をインストールするための異なるシステムがあります。 必要な手順を判断するには、Linux ディストリビューションのドキュメントを参照してください。

必要な依存関係は次のとおりです。

  • クロス リンカー、またはターゲットに対して出力できるリンカー。 clang はそのようなリンカーの 1 つです。
  • プロジェクトに対してobjcopyが有効になっている場合、stripまたはStripSymbolsのうち、ターゲット互換のものがあります。
  • ターゲット アーキテクチャの 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