什么是交叉编译
我们在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、下载好之后进行解压:
代码语言:javascript复制tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
2、把解压后的整个目录拷贝到自己想要存放的地方
代码语言:javascript复制我就放在了我统一管理的地方
mv gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi ~/soft/linux_tools/
代码语言:javascript复制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、测试是否可以运行
代码语言:javascript复制进入到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、记住如下目录
代码语言:javascript复制/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
如果想给某个特定用户配置,可以打开用户目录下的:
代码语言:javascript复制vim ~/.profile
vim ~/.bashrc
等等,都是可以的。
打开:
代码语言:javascript复制zh@zh-lpc:~$ vim ~/.bashrc
zh@zh-lpc:~$
加入:
代码语言:javascript复制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
让其生效:
代码语言:javascript复制zh@zh-lpc:~$ source ~/.bashrc
zh@zh-lpc:~$
测试:
代码语言:javascript复制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:~$
那么配置其他版本的也是如此。