cross compiling - ¿Cuál es la diferencia de la opción "./configure" "--build", "--host" y "--target"?
cross-compiling option (2)
El script ./configure
acepta 3 opciones --build
, --host
y --target
. Estoy confundiendo sus roles. ¿Cuál es la diferencia y la semántica de ellos?
Como se señala en esta publicación de blog y se alude a los Términos de configuración de GCC , --target
solo se aplica cuando está compilando cadenas de herramientas. Cuando haces una compilación cruzada normal de una biblioteca o un binario que usas
--build=the architecture of the build machine
--host=the architecture that you want the file to run on
Sin embargo, cuando construyes cadenas de herramientas, las cosas se pueden complicar. Creo que lo siguiente es correcto (aunque no puedo decir que alguna vez haya compilado manualmente un depurador cruzado):
Digamos que tienes:
- una máquina de construcción powerpc que va a hacer toda la compilación en
- varios dispositivos integrados, con procesadores mips, en los que se ejecutará su código
- una computadora portátil x86 que va a utilizar para depurar estos dispositivos en el campo
Debería configurar y crear su servidor de depuración (por ejemplo, gdbserver) para ejecutar en su dispositivo incrustado con
./configure --build=powerpc --host=mips
para que pueda usar Putty en su dispositivo incorporado y ejecutar "gdbserver: 1234 a.out" para iniciar la depuración y escuchar en el puerto 1234.
A continuación, construiría su cliente de depuración (que se conecta y controla el gdbserver) con
./configure --build=powerpc --host=i686 --target=mips
que copiarías en tu portátil x86 para que en el campo pudieras ejecutar "gdbclient embedded.device: 1234" para depurar tu programa a.out.
Todo esto se aplica también a los compiladores para los cuales es posible que desee consultar el enlace de GCC arriba o esta sección sobre la compilación cruzada de Canadá .
También tenga en cuenta que, en la práctica, es posible que no vea la compilación, el host o el destino especificados porque, de acuerdo con esta página de manual de Autoconf , "el objetivo predeterminado es el host, el host para compilar y el resultado de config.guess".
En una palabra, crea el código en --build
, run it en --host
con --target
architecture environment.
Nota: Argumento : el --target
solo tiene sentido cuando se --target
compilador (por ejemplo, GCC). Al ejecutar configure
antes de compilar GCC:
-
--build
: la máquina en la que estás construyendo -
--host
: la máquina para la que estás construyendo -
--target
: la máquina que GCC producirá binario para
De la documentación de GCC ( notas de instalación específicas de host / destino ):
Si build, host y target son todos iguales, esto se llama nativo. Si la construcción y el host son iguales pero el objetivo es diferente, esto se llama cruz. Si la construcción, el host y el objetivo son todos diferentes, esto se llama canadiense (por razones poco claras relacionadas con el partido político de Canadá y los antecedentes de la persona que trabaja en la construcción en ese momento). Si el host y el objetivo son iguales, pero la compilación es diferente, está utilizando un compilador cruzado para compilar un nativo para un sistema diferente. Algunas personas lo llaman hospedador host-x-host, nativo cruzado o nativo cruzado. Si la compilación y el objetivo son los mismos, pero el host es diferente, está utilizando un compilador cruzado para compilar un compilador cruzado que produce código para la máquina en la que está creando. Esto es raro, por lo que no hay una forma común de describirlo. Hay una propuesta para llamar a esto un contraataque.