交叉编译是什么
交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
例如:
我们再windows上面编写C51代码,并编译成可执行代码xx.hex,它是在c51上面运行,不是在windows上面运行
我们在ubuntu上面编写树莓派的代码,并编译成可执行代码如a.out,它是在树莓派上面运行,不是在ubuntu linux上面运行
编译是用编译程序产生目标程序的动作。
为什么要交叉编译
1、目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;
2、目的平台上的资源贫乏,无法运行我们所需要编译器;
3、目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心
宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台(如树莓派)。host编译得到的可执行代码在target上运行。
交叉编译需要用到什么工具
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(crosscompilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
2、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
3、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
以下是Linux中交叉编译树莓派的步骤:
交叉编译工具链的安装:
交叉编译工具链的安装包直接到树莓派官网即可下载,下载完成后:
1.从共享文件夹将安装包拷贝到工作目录:
cp /mnt/hgfs/share/tools-master.zip
2.解压
unzip tools-master.zip
解压以后我们进入到tools-master然后依次进入:
tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
这时候我们就可以看见这个目录下面有这个文件:
arm-linux-gnueabihf-gcc
这个就是我们的交叉编译器(其实它只是一个链接文件,真正的源文件是:arm-linux-gnueabihf-gcc-4.8.3);但是如果我们要使用交叉编译的话每次都要进入到这个文件夹才能使用这个编译器,非常的麻烦,这时候我们就可以通过配置环境变量来让我们无论在哪个目录下都能使用该工具:
配置环境变量
进入到带有交叉编译器的目录下:
cd /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
echo $PATH 获得当前环境变量的值
这里我是已经配置过的:没有配置过可能games:后面的内容不一样
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/xiexiong/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
临时有效,配置环境变量
将带有交叉编译器的路径加到games:后面,如下:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
一般建议直接使用永久有效的方式修改,因为临时有效配置后关闭终端后就失效了。
永久有效,配置环境变量
修改工作目录下的.bashrc 隐藏文件,配置命令终端的
vi /home/CLC/.bashrc
在文件最后一行加入:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
然后输入指令:
source /home/CLC/.bashrc
加载配置文件,马上生效配置。
使用交叉编译
交叉编译:
在虚拟机中检查下交叉编译工具对不对:
arm-linux-gnueabihf-gcc -v
4.8.3
编译指令:
arm-linux-gnueabihf-gcc xxx.c -o xxx
如何把编译生成的可执行文件下载到开发板(远程复制):
scp clientInPi pi@192.168.43.30:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径