Перекрестная компиляция

Кросс-компиляция — это процесс создания исполняемого кода для платформы, отличной от платформы, на которой выполняется компилятор. Разница между платформами может быть другой ОС или другой архитектурой. Например, компиляция программ для Windows на платформе Linux или для Arm64 на платформе x64. В Linux разница также может быть между стандартными реализациями библиотекИ C — glibc (например, Ubuntu Linux) или musl (например, Alpine Linux).

Собственный AOT использует средства платформы (компоновщики) для связывания библиотек платформы (статических и динамических) с AOT-компилированным управляемым кодом в окончательный исполняемый файл. Доступность кросс-компоновщиков и статических и динамических библиотек для целевой системы ограничивает пары ОС и архитектуры, которые могут выполнять перекрестную компиляцию.

Так как нет стандартизованного способа получения родного пакета SDK для macOS для использования в Windows или Linux, Windows SDK для использования в Linux или macOS, или пакета SDK для Linux для использования в Windows или macOS, нативный AOT не поддерживает кроссплатформенную компиляцию. Для компиляции кросс-ОС с помощью Native AOT требуется некоторая форма эмуляции, например виртуальная машина или WSL Windows.

Однако родной AOT обладает ограниченной поддержкой кросс-архитектурной компиляции. Если установлен необходимый собственный инструментарий, можно выполнить перекрестную компиляцию между архитектурами x64 и arm64 на Windows, Mac или Linux.

Виндоус

Перекрестная компиляция из x64 Windows в ARM64 Windows или наоборот работает до тех пор, пока установлены соответствующие средства сборки VS 2022 C++. Для целевого объекта ARM64 убедитесь, что установлен компонент Visual Studio "VS 2022 C++ ARM64/ARM64EC средства сборки (последняя версия)". Чтобы использовать x64, найдите вместо этого "Последние средства сборки x64/x86 для VS 2022 C++".

Мак

MacOS предоставляет цепочку инструментов x64 и arm64 в установке XCode по умолчанию.

Линукс

Каждый дистрибутив Linux имеет другую систему для установки собственных зависимостей цепочки инструментов. Ознакомьтесь с документацией по дистрибутиву Linux, чтобы определить необходимые действия.

Необходимые зависимости:

  • Кросс-линкер, или линкер, который может создавать для целевого объекта. clang является одним из таких компоновщиков.
  • Целевой совместимый objcopy или strip, если 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