Linux实现树莓派交叉编译
一、交叉编译
在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行所需要的编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译源代码,最终生成可在目标平台上运行的代码。
常见的交叉编译例子如下:
1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
二、交叉编译源代码
1、环境
Kali-Linux
2、树莓派交叉编译工具安装
step1. 下载树莓派交叉编译工具https://github.com/raspberrypi/tools
step2. 将源码放到各用户都能share的文件夹下,如/usr/tools
在该文件夹下,一共有5个不同版本的交叉编译工具
arm-bcm2708hardfp-linux-gnueabi gcc-linaro-arm-linux-gnueabihf-raspbian arm-bcm2708-linux-gnueabi gcc-linaro-arm-linux-gnueabihf-raspbian-x64 arm-rpi-4.9.3-linux-gnueabihf
其中arm-rpi-4.9.3-linux-gnueabihf和gcc-linaro-arm-linux-gnueabihf-raspbian-x64是64位机器用的,每一个交叉编译工具的目录下都有bin目录进入,执行./arm-linux-gnueabihf-gcc -v可查看gcc版本。
在这里我们使用的是 gcc-linaro-arm-linux-gnueabihf-raspbian-x64 版本!
step3. 将交叉编译工具的路径加到环境变量中,为了以后启动不用再设置,我加到了/etc/bash.bashrc中
gedit /etc/bash.bashrc或者#/etc/profile全局的,随系统启动设置【设置这个文件是一劳永逸的办法】#gedit /etc/profile
64位添加:#树莓派交叉编译环境:start export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin export PATH=$PATH:/usr/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin #树莓派交叉编译环境:start 32位添加:#树莓派交叉编译环境:start export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin(gcc有问题,暂不明) export PATH=$PATH:/usr/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin(使用这个文件中的gcc) #树莓派交叉编译环境:start
重新加载
source /etc/bash.bashrc
step4. 检测是否安装成功
way1:
arm #双tab
显示以下内容
way2:
arm-linux-gnueabihf-gcc -v #能显示正确信息 arm-linux-gnueabihf-g++ -v #能显示正确信息
三、编译源代码
1、在写编译脚本时,一定要确保编译器写的是交叉编译的编译器。比如比较常用的Makefile,
demo: $(obj) $(CXX) -o $^ $(LDFLAGS)
其中的CXX必须是arm-linux-gnueabihf-g++才能编译出正确的在树莓派上的可执行文件。
2、编译第三方库
如果你想设置全局的CC和CXX变量,在每次打开一个新的Terminal时,输入以下命令:
export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++
其他的全局变量同上。
四、简单例子测试
编写一个测试文件,在PC机上完成编译然后上传到树莓派中并执行。该例子仅测试交叉编译是否成功并简单测试了浮点数功能
新建一个文件夹hello,里面有两个文件hello.c 和 Makefile。
hello.c
#include <stdio.h> int main(void) { float pi = 3.14; printf("Hello World\n"); printf("%.2f\n",2*pi); }
Makefile
CC=arm-linux-gnueabihf-gcc hello:hello.o clean: rm -rf hello.o hello
在makefile文件中使用了至少两条隐含规则,CC为默认工具链;.o文件由同名的.c文件生成。
在该文件夹下,进行make一下
make
把产生的可执行文件hello上传到树莓派,执行hello可执行文件,可以得到正确结果,说明交叉编译链配置成功
ls chmod 777 hello #赋予可执行权限 ./hello
参考:https://blog.csdn.net/caomang23/article/details/82658982
https://blog.csdn.net/u010833052/article/details/78481973
https://blog.csdn.net/iefenghao/article/details/88815093
https://blog.csdn.net/qq_16397695/article/details/83063826
https://shumeipai.nxez.com/2013/10/08/configure-cross-compiler-platform-raspberry-pi.html