Compartir a través de


Compilación cruzada

La compilación cruzada es un proceso de creación de código ejecutable para una plataforma distinta de la que ejecuta el compilador. La diferencia de plataforma puede ser un sistema operativo diferente o una arquitectura diferente. Por ejemplo, la compilación para Windows desde Linux o para Arm64 desde x64. En Linux, la diferencia también puede estar entre las implementaciones estándar de la biblioteca de C: glibc (por ejemplo, Ubuntu Linux) o musl (por ejemplo, Alpine Linux).

AOT nativo usa herramientas de plataforma (enlazadores) para vincular bibliotecas de plataforma (estáticas y dinámicas) junto con código administrado compilado por AOT en el archivo ejecutable final. La disponibilidad de los enlazadores cruzados y las bibliotecas estáticas o dinámicas para el sistema de destino limita los pares de sistema operativo o arquitectura que pueden compilarse entre sí.

Dado que no hay ninguna manera estandarizada de obtener el SDK nativo de macOS para su uso en Windows/Linux o Windows SDK para su uso en Linux/macOS, o un SDK de Linux para su uso en Windows/macOS, AOT nativo no admite la compilación entre sistemas operativos. La compilación entre sistemas operativos con AOT nativo requiere alguna forma de emulación, como una máquina virtual o WSL de Windows.

Sin embargo, AOT nativo tiene compatibilidad limitada con la compilación entre arquitecturas . Siempre que se instale la cadena de herramientas nativa necesaria, es posible cross-compilar entre las arquitecturas x64 y arm64 en Windows, Mac o Linux.

Windows

La compilación cruzada desde x64 Windows a ARM64 Windows o viceversa funciona siempre que se instalen las herramientas de compilación de C++ de VS 2022 adecuadas. Para tener como destino ARM64, asegúrese de que está instalado el componente de Visual Studio "VS 2022 C++ ARM64/ARM64EC build tools (Latest)". Para tener como destino x64, busque "Visual Studio 2022 C++ x64/x86 herramientas de compilación (Última versión)" en su lugar.

Mac

MacOS proporciona las cadenas de herramientas x64 y amd64 en la instalación predeterminada de XCode.

Linux

Cada distribución de Linux tiene un sistema diferente para instalar dependencias nativas de cadenas de herramientas. Consulte la documentación de la distribución de Linux para determinar los pasos necesarios.

Las dependencias necesarias son:

  • Un enlazador cruzado, o un enlazador que puede enviar hacia el destino. clang es un enlazador de este tipo.
  • Compatible con el destino objcopy o strip, si StripSymbols está habilitado para tu proyecto.
  • Archivos de objeto para el tiempo de ejecución de C de la arquitectura de destino.
  • Archivos de objeto para zlib para la arquitectura de destino.

Los siguientes comandos pueden ser suficientes para compilar para linux-arm64 en Ubuntu 22.04 amd64, aunque esto no está documentado o garantizado por 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