como-cross-compilar-c-para-arm-desde-un-ordenador-x86-x64

Cómo cross compilar C++ para ARM desde un ordenador X86/X64

Hoy vamos a ver como compilar una aplicación de C++ para un procesador ARM desde un ordenador con arquitectura x86 o x64.

Para ello, en primer lugar, debemos instalar las dependencias necesarias.

sudo apt-get install libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev build-essential bison flex libssl-dev bc

A continuación, instalamos la versión de G++ adecuada a nuestra arquitectura ARM. Una de las mayores complicaciones es la designación de los procesadores ARM, que condiciona las dependencias necesarias.

En caso de dudas, esta entrada puede seros de ayuda. Pero, en resumen, los procesadores ARMv7 y anteriores son de 32 bits, mientras que los ARMv8 y posteriores son de 64 bits (compatibles con 32 bits).

Por otro lado, existen cross compilers para operaciones de coma flotante ejecutadas por software (como gnueabi) y operaciones de coma flotante implementadas en hardware (como gnueabihf). Si es posible usar el segundo, es preferido frente al primero.

Así que, en función del tipo de procesador que tengamos hacemos lo siguiente,

Para ARM 32bits

sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

Para ARM 64bits

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

Ahora, para probar, vamos a crear un simple programa “hola mundo”. Para ello, creamos un fichero ‘main.cpp’ con el siguiente contenido.

int main(int argc, char *argv[]) {
    cout << "Hola mundo!" << endl;
    return 0;
}

Para compilarlo, ejecutamos el siguiente comando.

Para ARM 32bits

arm-linux-gnueabihf-g++ main.cpp -o hello

Para ARM 64bits

aarch64-linux-gnu-gcc main.cpp -o hello

Movemos el fichero ‘hello’ a nuestra máquina objetivo, y cambiamos los permisos de ejecución (por ejemplo, a 777).

Ejecutamos nuestro programa de prueba con el siguiente comando.

./hello

Si todo ha salido correctamente, deberíamos ver nuestro mensaje de “Hola mundo!” en la consola de comandos.