什么是交叉编译
我们在Linux中使用自带的gcc和g++编译器进行编译的程序是针对X86架构的。而我们开发板大多都是ARM或者其他架构的开发板,我们就需要编译出针对其他架构的程序。
那么究竟什么是交叉编译呢?
其实就是在我们的PC(X86)上编译出其他平台上的代码,就称它为交叉编译。
想编译出在其它平台上可执行的程序,就需要使用不同的编译器,因为不同的编译器有不同的指令集等。
关于
交叉编译器有很多,我们本次采用linaro公司提供的一个交叉编译工具。
地址:http://releases.linaro.org/
直达地址:
http://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabi/
1、下载好之后进行解压:
tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
2、把解压后的整个目录拷贝到自己想要存放的地方
我就放在了我统一管理的地方
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、测试是否可以运行
进入到bin目录后,执行./arm-linux-gnueabi-gcc -v 查看版本信息。如果成功了,说明可以了。
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、配置环境变量
如果想直接像系统自带的gcc命令这样随处可以执行的话,就需要配置环境变量。
4-1、记住如下目录
/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、打开配置文件
我们可以选择给系统中的所有用户配置,那么就打开:/etc/profile
如果想给某个特定用户配置,可以打开用户目录下的:
vim ~/.profile vim ~/.bashrc
等等,都是可以的。
打开:
zh@zh-lpc:~$ vim ~/.bashrc zh@zh-lpc:~$
加入:
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
让其生效:
zh@zh-lpc:~$ source ~/.bashrc zh@zh-lpc:~$
测试:
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:~$
那么配置其他版本的也是如此。