0.前言
【1】为什么要使用交叉编译
交叉编译工具较快开发的速度。树莓派中已经安装了gcc工具链,可在树莓派中直接编译源代码生成可执行文件。于此同时,PC机上也可使用gcc工具链生成可执行代码,但是和树莓派上的gcc工具不同,PC机上的gcc工具生成intel或amd芯片上可执行的代码,但树莓派却是arm系列的芯片,显然存在不小的差异。那么使用交叉工具链便可在PC机上开发树莓派中可执行程序。
虽然树莓派的主频可达700MHz远高于一般的嵌入式系统,但相比于PC机其性能还是差些,使用交叉工具链可节约开发时间。在编译链接同等规模的代码时,PC机所用的时间应少于树莓派所用时间,通过交叉编译的方法提高效率。
【2】clone交叉工具链
在home路径下建立一个文件夹取名为rpi
mkdir rpi
进入该目录并执行clone操作(更正一处错误)
cd rpi
请注意clone的时间较长请耐心等待。clone完成之后可进入以下目录查看工具链的具体内容。
cd ~/rpi/tools/arm-bcm2708/
【特别提醒】
克隆完成之后可以通过pull更新tools
cd ~/rpi/tools
git pull origin
该目录中存在4个文件夹,本例使用gcc-linaro-arm-linux-gnueabihf-raspbian 或 gcc-linaro-arm-linux-gnueabihf-raspbian-x64。前者对应32位系统后者对应64位系统。
arm-bcm2708hardfp-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian
arm-bcm2708-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian-x64
【3】加入环境环境变量
在/.bashrc文件中加入gcc交叉工具链目录。
sudo gedit ~/.bashrc
在该文件最后加入交叉工具链所在目录。请注意~符号表示HOME路径,.bashrc为隐藏文件。
【32位系统】
export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin(gcc有问题,暂不明)
export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708-linux-gnueabi/bin(使用这个文件中的gcc)
【64位系统】
export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708-linux-gnueabi/bin
请注意PATH代表环境变量,:冒号代表追加。
保存并退出文件,接着执行以下指令以便立即更新当前控制台所包含的环境变量。
source .bashrc
【4】简单测试
为了测试交叉工具链是否安装成功,可在控制台中输入
arm-bcm2708-linux-gnueabi-gcc -v
控制台中输出内容如下,次步骤可证明交叉工具链安装完成且环境变量设置无误。
图1 arm-linux-gnueabihf-gcc版本信息
2.简单的例子
编写一个测试文件,在PC机上完成编译然后通过FTP上传到树莓派中并执行。
【测试代码】
文件名为hello-world.c,该例子仅测试交叉编译是否成功并简单测试了浮点数功能。
- #include <stdio.h>
- int main(void)
- {
- float pi = 3.14;
- printf("Hello World\n");
- printf("%.2f\n",2*pi);
- }
【交叉编译——简单指令】
cd进入hello-world.c所在目录,输入以下指令以生成可执行文件。请注意该可执行文件不能在PC机上运行。
arm-bcm2708-linux-gnueabi-gcc hello-world.c -o hello-world
最终可在hello-world.c的同目录中生成hello-world可执行文件。
【交叉编译——makefile】
当然也可在该目录下建立makefile文件,简单的makefile文件如下
- CC=arm-linux-gnueabihf-gcc
- hello-world:hello-world.o
- clean:
- rm -rf hello-world.o hello-world
在makefile文件中使用了至少两条隐含规则,CC为默认工具链;*.o文件由同名的*.c文件生成。
那么在控制台中输入make即可生成可执行文件。
【FTP上传】
可在ubuntu中安装filezilla软件,该软件具有ubuntu版本可通过ubuntu软件中心直接安装。ubuntu版本和windows使用方法相同。
图2 使用FileZilla上传文件
【SSH登陆执行】
假设raspberry的IP地址为192.168.1.107,可使用以下指令登陆raspberry
ssh pi@192.168.1.107
登陆之后进入可执行文件所在目录,修改该文件的执行权限。
sudo chmod 755 hello-world
该文件的所有者为pi,所有者pi对于该可执行文件具有可写可读可执行权限(7),755中的后两个55为可读与可执行,本例中对于hello-world用处不大。
输入以下指令便可运行该文件
./hello-world
控制台输出结果,至此可完全证明交叉工具链工作正常。
图3 树莓派中执行结果