クロスコンパイルは、コンパイラが実行されているプラットフォーム以外のプラットフォームの実行可能コードを作成するプロセスです。 プラットフォームの違いは、異なる 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
.NET