Compartilhar via


Compilação cruzada

A compilação cruzada é um processo de criação de código executável para uma plataforma diferente daquela em que o compilador está em execução. A diferença de plataforma pode ser um sistema operacional diferente ou uma arquitetura diferente. Por exemplo, compilar para Windows a partir de Linux, ou para Arm64 a partir de x64. No Linux, a diferença também pode estar entre as implementações padrão da biblioteca C – glibc (por exemplo, Ubuntu Linux) ou musl (por exemplo, Alpine Linux).

O AOT nativo usa ferramentas de plataforma (vinculadores) para vincular bibliotecas de plataforma (estáticas e dinâmicas) junto com o código gerenciado compilado por AOT no arquivo executável final. A disponibilidade de vinculadores cruzados e bibliotecas estáticas/dinâmicas para o sistema de destino limita os pares de sistema operacional/arquitetura que podem ser compilados cruzadamente.

Como não há uma maneira padronizada de obter o SDK nativo do macOS para uso no Windows/Linux ou no SDK do Windows para uso no Linux/macOS ou um SDK do Linux para uso no Windows/macOS, o AOT nativo não dá suporte à compilação entre sistemas operacionais. A compilação entre sistemas operacionais com o Native AOT requer alguma forma de emulação, como uma máquina virtual ou como o Windows WSL.

No entanto, o AOT nativo tem suporte limitado para compilação entre arquiteturas . Desde que a cadeia de ferramentas nativa necessária esteja instalada, é possível compilar entre as arquiteturas x64 e arm64 no Windows, Mac ou Linux.

Windows

A compilação cruzada do Windows x64 para o Windows ARM64 ou vice-versa funciona desde que as ferramentas de build do VS 2022 C++ apropriadas sejam instaladas. Para compilar para ARM64, verifique se o componente do Visual Studio "VS 2022 C++ ARM64/ARM64EC ferramentas de compilação (mais recente)" está instalado. Para direcionar para x64, busque "Ferramentas de build do VS 2022 C++ x64/x86 (Últimas)".

Mac

O MacOS fornece as cadeias de ferramentas x64 e arm64 na instalação padrão do XCode.

Linux

Cada distribuição do Linux tem um sistema diferente para instalar dependências de conjunto de ferramentas nativas. Consulte a documentação da distribuição do Linux para determinar as etapas necessárias.

As dependências necessárias são:

  • Um agente de ligação cruzada ou um agente de ligação que pode emitir para o alvo. clang é um desses vinculador.
  • objcopy ou strip compatíveis com o destino, se StripSymbols estiver habilitado para seu projeto.
  • Arquivos de objeto para o runtime C da arquitetura de destino.
  • Arquivos de objeto para zlib para a arquitetura alvo.

Os comandos a seguir podem ser suficientes para compilação linux-arm64 no Ubuntu 22.04 amd64, embora isso não esteja documentado ou garantido pelo 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