交叉编译是什么:
交叉编译是一个行为,是在一个平台上生成另一个平台上的可执行代码。
比如:我们在windows上面编写C51的代码,并编译成可执行代码,如xx.hex,是在C51上面运行不是在windows上面运行。
同样:我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如xx.out,是在树莓派上面运行不是在linux上面运行。
编译:是在一个平台上生成在该平台上的可执行的代码。
C51 交叉编译的发生在kill(集成环境上面)
为什么要交叉编译:
平台上不允许或不能够安装我们所需要的编译器,比如C51,而树莓派可以。
1、目的平台上的资源贫乏,无法运行我们所需要编译器
2、既然树莓派能够安装我们所需要的编译器,是不是不需要交叉编译?
其实也要
因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。操作系统也是代码,也需要编译。
平台运行至少需要两样东西:bootloader(后动引导代码)以及操作系统核心。
宿主机(host):编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
交叉编译需要用到的工具:
交叉编译器,交叉编译工具链
交叉编译相关内容详细介绍:https://baike.baidu.com/item/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91/10916911?fr=aladdin
交叉编译工具链的安装:
1、临时有效
PATH环境变量(将命令加入终端,使命令使用更加方便,不用敲很长的路径)
1、从共享文件夹拷贝到工作目录
cp /mnt/hgfs/sharefromwindows/tools-master.zip .
2、解压
unzip tools-master.zip
3、找到工具路径
cd tools-master/lscd arm-bcm2708lscd gcc-linaro-arm-linux-gnueabihf-raspbian-x64lscd binls./arm-linux-gnueabihf-gcc -vecho $PATH// 显示当下的环境变量pwd//显示当前文件夹下的路径export PATH=/usr/lib/lightdm/lightdm:/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
(export是配置环境变量的意思)
注意:
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:是从echo中复制的
/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin是pwd指令生成的所想要省略的文件路径
4、然后回到工作目录下
arm-linux-gnueabihf-gcc -v//查看是否完成,出现gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03)表示完成
2、永久有效
修改工作目录下的.bashrc (隐藏文件),用来配置命令终端的
vi /home/CLC/.bashrc方法:将配置环境变量的代码粘贴到文件最后,就是export PATH=/usr/lib/lightdm/lightdm:/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//加载配置文件,马上生效配置。
交叉编译工具链压缩包:
链接:https://pan.baidu.com/s/1ApdowTcTe4vchY_0qci5qA
提取码:9vci
这篇博文更加详细:https://blog.csdn.net/weixin_45309916/article/details/107789879
交叉编译如何执行:
gcc test.c -o test_1
file test_1
//file 用来查看文件属性
test_1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xcfc35e8f92f7737433ebe182ff90ac60a2f058c7, not stripped
//executable 表示可执行文件
//只能运行在X86-64位的电脑上arm-linux-gnueabihf-gcc test.c -o test_2
//交叉编译,将test.c编译成树莓派可执行的代码
file test_2
//查看文件属性
test_2: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xb6ef18cf7462c1c0d7f4b8e455972204ae718324, not stripped./test_2
//在ubuntu上运行编译的树莓派的代码
bash: ./test_2: cannot execute binary file
//报错:不能解析这个文件scp test_2 pi@192.168.0.118:/home/pi
//将这个编译好的程序复制到树莓派的/home/pi中
//格式是:scp 程序名 开发板的用户名@树莓派IP地址:开发板的绝对路径