交叉编译是什么?
要了解交叉编译首先我们得先了解编译是什么。
编译:是在一个平台上生成在该平台上的可执行代码。
比如我在ubuntu上面编写ubuntu的代码,并编译成可执行代码,如a.out,并在ubuntu上运行
交叉编译:是在一个平台上生成另一个平台上的可执行代码。
比如我在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行
或者我们在windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行
C51单片机交叉编译的发生在keil(集成环境上面)
eclipse交叉编译,人家做好了我们用只是不知道而已。(和keil一样)
所谓的平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
为什么要交叉编译?
平台上不允许或不能够安装我们所需要的编译器比如C51(内存小,没办法有编译工具)
- 因为目的平台上的资源贫乏,无法运行我们所需要编译器
- 树莓派需不需要交叉编译?
需要 树莓派有时因为目标平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
操作系统也是代码,也需要编译!
平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心
宿主机(host): 编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target): 用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
宿主机和目标机之间区别:通过一组连接传输信息,将代码、映像从宿主机下载到目标机,连接通信的方式有网口、串口等。
交叉编译需要用到什么工具?
交叉编译器、交叉编译工具链
如何安装交叉编译工具链
去https://github.com/raspberrypi/网站下载
从共享文件夹中的压缩包拷贝到工作目录
cp /mnt/hgfs/share/tools-master.zip .
在工作目录中解压tools-master.zip
unzip tools-master.zip
解压完后在目录中有个tools-master文件夹
32位的:
cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
64位的:
cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
ls 查看当前目录文件,可以看到一个软链接(linux下是蓝色的)arm-linux-gnueabihf-gcc 这就是我们需要用的工具,可以输入arm-linux-gnueabihf-gcc -v 和gcc -v对比看看。
如果我们每次需要用整个工具都要打这么长的路径太麻烦了,就需要配置环境变量了
把系统的某些路径加进来,敲指令的时候,就会认识躲在这些路径下的指令,就不需要敲前面的路径了
配置临时环境变量
echo $PATH 显示当下的环境变量
可能你们和我的环境变量不一样,但是 /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games: 是一样的
然后pwd显示当前文件路径
我的路径是:/home/JTL/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
格式export PATH=(上面两个路径)
注意:因为编辑问题,可能会显示export 和 PATH 分开,这两个之间就只有一个空格!!
export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/JTL/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
然后就可以cd 回到工作目录 可以输入arm-linux-gnueabihf-gcc -v指令,会发现可以识别了
注意:临时环境变量只有在当前窗口有用
配置永久环境变量
修改工作目录下的 .bashrc 隐藏文件,配置命令终端的
如何修改呢?
vi /home/JTL/.bashrc
到文件最后加上export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/JTL/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
和配置临时变量的是一样的,然后
source /home/JTL/.bashrc 加载配置文件,马上生效配置。
现在不管打开几个窗口都可以识别到
注意:!!!每个人的用户名不一样,把我的用户名(JTL)换成你们自己的用户名!!!!
交叉编译服务端客户端
交叉编译:
arm-linux-gnueabihf-gcc -v 查看我们下载的版本
4.8.3(这是我下载的版本)
arm-linux-gnueabihf-gcc xxx.c -o xxx(和gcc一样)
如何把编译生成的可执行文件下载到开发板:
scp clientInPi pi@192.168.43.30:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径