¿Qué es la compilación cruzada?
Los programas que compilamos en Linux utilizando los compiladores integrados gcc y g++ son para la arquitectura X86. La mayoría de nuestras placas de desarrollo son placas de desarrollo de ARM u otras arquitecturas, y necesitamos compilar programas para otras arquitecturas.
Entonces, ¿qué es exactamente la compilación cruzada?
De hecho, se trata de compilar el código de otras plataformas en nuestro PC (X86), lo que se denomina compilación cruzada.
Si desea compilar programas ejecutables en otras plataformas, necesita usar compiladores diferentes, porque los compiladores diferentes tienen conjuntos de instrucciones diferentes.
acerca de
Hay muchos compiladores cruzados, esta vez usamos una herramienta de compilación cruzada proporcionada por la compañía Linaro.
Dirección: http://releases.linaro.org/
Enlace directo:
http://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabi/
1. Después de la descarga, descomprímelo:
tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
2. Copie todo el directorio descomprimido en el lugar donde desea almacenarlo
Lo puse en mi lugar de administración unificada
mv gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi ~/soft/linux_tools/
zh@zh-lpc:~/soft/linux_tools$ pwd
/home/zh/soft/linux_tools
zh@zh-lpc:~/soft/linux_tools$ ls
gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi
zh@zh-lpc:~/soft/linux_tools$
3. Prueba si se puede ejecutar
Después de ingresar al directorio bin, ejecute ./arm-linux-gnueabi-gcc -v para ver la información de la versión. Si tiene éxito, está bien.
zh@zh-lpc:~/soft/linux_tools$
zh@zh-lpc:~/soft/linux_tools$ cd gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi$ cd bin/
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$ pwd
/home/zh/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$ ls
arm-linux-gnueabi-addr2line arm-linux-gnueabi-cpp arm-linux-gnueabi-gcc-ar arm-linux-gnueabi-gfortran arm-linux-gnueabi-objcopy arm-linux-gnueabi-strings
arm-linux-gnueabi-ar arm-linux-gnueabi-elfedit arm-linux-gnueabi-gcc-nm arm-linux-gnueabi-gprof arm-linux-gnueabi-objdump arm-linux-gnueabi-strip
arm-linux-gnueabi-as arm-linux-gnueabi-g++ arm-linux-gnueabi-gcc-ranlib arm-linux-gnueabi-ld arm-linux-gnueabi-ranlib gdbserver
arm-linux-gnueabi-c++ arm-linux-gnueabi-gcc arm-linux-gnueabi-gcov arm-linux-gnueabi-ld.bfd arm-linux-gnueabi-readelf runtest
arm-linux-gnueabi-c++filt arm-linux-gnueabi-gcc-4.9.4 arm-linux-gnueabi-gdb arm-linux-gnueabi-nm arm-linux-gnueabi-size
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$ ./arm-linux-gnueabi-gcc -v
使用内建 specs。
COLLECT_GCC=./arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/zh/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/../libexec/gcc/arm-linux-gnueabi/4.9.4/lto-wrapper
目标:arm-linux-gnueabi
配置为:/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/snapshots/gcc-linaro-4.9-2017.01/configure SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-objc-gc --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=soft --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --with-fpu=vfpv3-d16 --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/sysroots/arm-linux-gnueabi --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabi/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabi --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu
线程模型:posix
gcc 版本 4.9.4 (Linaro GCC 4.9-2017.01)
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$
4. Configurar variables de entorno
Si desea poder ejecutarlo en cualquier lugar directamente como el comando gcc que viene con el sistema, debe configurar las variables de entorno.
4-1, recuerda el siguiente directorio
/home/zh/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$ pwd
/home/zh/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
zh@zh-lpc:~/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin$
4-2 Abra el archivo de configuración
Podemos elegir configurar todos los usuarios en el sistema, luego abrir: /etc/profile
Si desea configurar un usuario específico, puede abrir el directorio de usuarios:
vim ~/.profile
vim ~/.bashrc
Espera, todo es posible.
Abierto:
zh@zh-lpc:~$ vim ~/.bashrc
zh@zh-lpc:~$
participar:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/zh/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
Hazlo funcionar:
zh@zh-lpc:~$ source ~/.bashrc
zh@zh-lpc:~$
prueba:
zh@zh-lpc:~$
zh@zh-lpc:~$ arm-linux-gnueabi
arm-linux-gnueabi-addr2line arm-linux-gnueabi-gcc-ar arm-linux-gnueabihf-c++ arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-objcopy arm-linux-gnueabi-objcopy
arm-linux-gnueabi-ar arm-linux-gnueabi-gcc-nm arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcov arm-linux-gnueabihf-objdump arm-linux-gnueabi-objdump
arm-linux-gnueabi-as arm-linux-gnueabi-gcc-ranlib arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcov-tool arm-linux-gnueabihf-ranlib arm-linux-gnueabi-ranlib
arm-linux-gnueabi-c++ arm-linux-gnueabi-gcov arm-linux-gnueabihf-dwp arm-linux-gnueabihf-gdb arm-linux-gnueabihf-readelf arm-linux-gnueabi-readelf
arm-linux-gnueabi-c++filt arm-linux-gnueabi-gdb arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gfortran arm-linux-gnueabihf-size arm-linux-gnueabi-size
arm-linux-gnueabi-cpp arm-linux-gnueabi-gfortran arm-linux-gnueabihf-g++ arm-linux-gnueabihf-gprof arm-linux-gnueabihf-strings arm-linux-gnueabi-strings
arm-linux-gnueabi-elfedit arm-linux-gnueabi-gprof arm-linux-gnueabihf-gcc arm-linux-gnueabihf-ld arm-linux-gnueabihf-strip arm-linux-gnueabi-strip
arm-linux-gnueabi-g++ arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc-6.2.1 arm-linux-gnueabihf-ld.bfd arm-linux-gnueabi-ld
arm-linux-gnueabi-gcc arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-ld.gold arm-linux-gnueabi-ld.bfd
arm-linux-gnueabi-gcc-4.9.4 arm-linux-gnueabihf-as arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-nm arm-linux-gnueabi-nm
zh@zh-lpc:~$ arm-linux-gnueabi-gcc -v
使用内建 specs。
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/zh/soft/linux_tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/../libexec/gcc/arm-linux-gnueabi/4.9.4/lto-wrapper
目标:arm-linux-gnueabi
配置为:/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/snapshots/gcc-linaro-4.9-2017.01/configure SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-objc-gc --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=soft --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --with-fpu=vfpv3-d16 --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/sysroots/arm-linux-gnueabi --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabi/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabi --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu
线程模型:posix
gcc 版本 4.9.4 (Linaro GCC 4.9-2017.01)
zh@zh-lpc:~$
Luego configure también otras versiones.