交叉编译的概念,工具链安装,项目运行
1.交叉编译的概念:
交叉编译是什么?
编译:是在一个平台上生成该平台上的可执行代码
交叉编译:是在一个平台上生成另一个平台上的可执行代码。
(我们在windows上面编写C51代码,并编译成可执行代码,xx.hex,但在c51上面运行,不在windows上运行)
(我们需要在linux上面编写树莓派代码,并编译成可执行代码,如:a.out,但在树莓派上运行,不在linux上运行)
C51,STM32:交叉编译发生在keil(集成环境上面)
既然我们已经有了主机编译器,那为什么还要交叉编译呢?
有时是因为目的平台上不允许或不能够安装我们所需要的编译器,
比如:C51
1.因为目的平台上的资源贫乏,无法运行我们所需要编译器
2.因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。操作系统也是代码,也要编译。
既然可以交叉编译,那还要主机编译干吗?
交叉编译是不得已而为之!与主机编译相比,交叉编译受的限制更多,虽然在理论上我们可以做任何形式的交叉编译,但事实上,由于受到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下!举例来说,我们至今无法生成惠普公司专有的som格式的可执行文件,因此我们根本无法做目的平台为HPPA-HPUX的交叉编译。
平台运行需要至少两样东西:
bootloader(启动引导代码)以及操作系统核心
宿主机(host):编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
交叉编译需要用到的工具?
交叉编译器(交叉编译工具链)
2.树莓派(或者其它平台)交叉编译工具链的安装
交叉编译工具链的安装
举例:使用keil进行编译的时候需要对交叉编译器(交叉编译工具链)进行选型,C51,STM32;
代码的移植性高:是指一段代码编译后可以在不同的平台上运行;比如:C51,STM32,代码的修改部分不是很多
我们需要用到树莓派的交叉工具链:
下载网址:
树莓派交叉编译工具链
tools----code
将Windows下的压缩包拉至Linux下,并移动到建好的pi文件夹
//也可以从共享文件夹拷贝到工作目录
在终端执行以下操作:
cd pi //进入文件夹,ls//显示 tools-master.zipunzip tools-master //解压文件夹。。。//等待cd tools-masterls //显示文件夹cd arm-bcm2708 lscd gcc-linaro-arm-linux-gnueabihf-raspbian//选择32位编辑器lscd binls //可以看到一堆绿色的可执行文件./arm-linux-gnueabihf-gcc -v //去执行该文件//---------------过程太过繁琐//1.临时有效:配置环境变量//PATH 环境变量:目的是省去敲写前面的乱七八糟的文件夹echo $PATH //接下来配置环境变量pwd //显示当前绝对路径PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/dazai/pi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin//配置环境变量cd//回到根目录arm-linux-gnueabihf-gcc -v //用来编译树莓派可执行文件//二gcc是用来编译本地可执行文件//之所以是临时,是因为如果你再打开一个终端窗口,就木得了2.永久有效:修改.bashrc 隐藏文件修改工作目录下的.bashrc 隐藏文件,配置命令终端的//在根目录下:cdvi .bashrc //或者gedit .bashrc//将:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/dazai/pi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin//放到106行的fi下面//之后保存退出source .bashrc //使其生效//之后再打开任何一个终端窗口都含有(认识):arm-linux-gnueabihf-gcc
至此,树莓派编辑器(交叉编译工具链),安装完成。
3.交叉编译服务器客户端:
一个简单的程序:
#include <stdio.h>int main(){printf("hello\n");return 0;}
gcc text.c -o text_1//编译file text_1 //查看编译后的文件可执行在哪些系统上
怎样把text.c放到树莓派上去运行,我们用到交叉编译工具:
arm-linux-gnueabihf-gcc text.c -o text_2file text_2
将text_2可执行文件复制到树莓派操作系统
linux终端下:
scp text_2 pi@192.168.1.100: //注意: 后面跟路径,可以不写//密码:raspberry
树莓派操作系统下:
通过以上交叉编译,可实现将上位机书写的程序编译成树莓派能够运行的可执行程序。