目录
1、交叉编译初识
1.1 什么是交叉编译
1.2 为什么需要交叉编译
1.3 宿主机和目标机
2、搭建交叉编译工作环境
2.1 安装工具链
2.2 配置环境变量
2.2.1 配置临时环境变量
2.2.2 配置永久环境变量
3、交叉编译宿主机与目标机实战
3.1 在Ubuntu上编写一个简单的程序:程序的文件名为:demo1.c
3.2 宿主机编译生成的可执行文件下载到目标机(开发板)
4、带wiringPi库的交叉编译
4.1 将树莓派中自带的wiringPi库上传到宿主机中
4.2树莓派使用scp 拷贝libwiringPi.so.2.50时出现的问题解决
5、软链接和硬链接
5.1 软链接
5.2 硬链接
6、带wiringPi库的软链接编译
- 编译:是在一个平台上生成在该平台上的可执行代码
- 交叉编译:是在一个平台上生成另一个平台上的可执行代码。
● 我们在windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行
● 我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行的
● 平台上不允许或不能够安装我们所需要的编译器比如C51;
● 因为目的平台上的资源贫乏,无法运行我们所需要编译器;
● 树莓派作为一款强大的开发板,同样也需要用到交叉编译。树莓派有时因为目的平台还没有建立,暂无操作系统,所以根本不能运行编译器。
● 操作系统也是代码,也要编译!
● 平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心。
● 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机(电脑X86)。
● 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行(树莓派ARM)。
工具链下载网址:https://github.com/raspberrypi/
(1) 将下载好的工具链文件放入Windows与Ubuntu的共享文件夹中;
(2) 打开Ubuntu,从共享文件夹拷贝到工作目录。输入命令:
cp /mnt/hgfs/sharetoubantu/tools-master.zip .//我的共享文件名是sharetoubantu
(3) 解压文件: unzip tools-master.zip
(4) 进入解压好的文件目录中,依次进入如下目录直到bin目录(64位计算机按如下选择)
cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
(5)ls进入bin目录里,找到 arm-linux-gnueabihf-gcc (6)指令arm-linux-gnueabihf-gcc -v 检查交叉工具链是否是4.8.3版本
临时:只在当前页面有效,离开当前页面又需要重新配置;
永久:任何页面或路径下都有效。
(1)在上面操作交叉编译工具链可以看到,要使用工具链就必须进入层层目录,繁琐且麻烦,降低开发效率;
(2)配置环境变量就能很好的解决这一问题;
(1) echo $PATH : 显示当前的环境变量;
(2) pwd :显示当前路径,并复制;
(3) export PATH= : 配置环境变量 = 红线部分 + 当前路径
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/wj/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
(4)回车确定,cd 回到工作目录
(5) arm-linux-gnueabihf-gcc -v :检查
(1)修改工作目录下的.bashrc 隐藏文件,配置命令终端的vi /home/dhw/.bashrc 打开后在文本最后一行加入以下内容:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/wj/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
(2)source /home/dhw/.bashrc 加载配置文件,马上生效配置。
#include
int main()
{
printf("Hello Wang!!!\n");
return 0;
}
● 常规编译:gcc demo1.c -o test_1。生成test_1这个可执行程序;
● 交叉编译:arm-linux-gnueabihf-gcc demo1.c -o test_2 。生成test_2这个可执行程序;
用file命令分别查看可程序test_1和test_2的属性:
● test_1在x86-64位计算机上面运行(宿主机-电脑),无法在ARM平台上运行
● test_2在ARM平台上运行(目标机-树莓派),无法在X86平台上运行
scp test_2 [email protected]:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
此方法也可以将目标机文件传至宿主机
在目标机上会生成test_2文件,然后将其进行编译运行即可。
说明:我们在树莓派中编写带wiringPi库的程序时(比如IO口),直接在程序中加头文件#include
1 正常情况下我们要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的链接库的格式也是正确的。
2、由于链接库的格式不正确,是宿主机的平台,所以我们要用树莓派自带的wiringPi库。
(1) cd /usr/lib :树莓派wiringPi库的文件路径;
(2)ls -l |grep wiringPi :过滤出只有wiringPi库的相关文件
(3)将软链接libwiringPi.so指向的libwiringPi.so.2.50下载到Ubuntu或宿主机中:
scp libwiringPi.so.2.50 [email protected]:/home/wj/lessonPI
在使用ssh的时候发现不能用,包括scp远程拷贝也被拒绝
解决办法:输入如下指令:
sudo apt-get install openssh-server
然后完成之后,ssh就可以正常工作了
详情可参考博客:https://blog.csdn.net/admin_plmm/article/details/115037036?spm=1001.2014.3001.5502
注意:这里要拷贝软连接指向的文件,如果直接拷贝软链接到Ubuntu,Ubuntu里并不会生成我们要的软链接。
那么需要自己来生成软链接!首先了解软硬链接的概念:
可参考博文:https://www.cnblogs.com/zhangna1998517/p/11347364.html
- 软链接文件有类似于Windows的快捷方式。
- 它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
- 它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间
● 在选定的位置上生成一个和源文件大小相同的文件;
● 硬链接通过索引节点来进行链接;在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接
● 允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放,也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
生成方法:
ln libwiringPi.so.2.50 libwiringPi.so
没有参数 -s
编译时通过-I -L来指定相关库的路径
● -I (注意是大写的i) 给gcc添加自定义的头文件的路径
● -L 给gcc添加额外的搜索库的路径
arm-linux-gnueabihf-gcc demo2.c -I /home/wj/lessonPI/WiringPi/wiringPi -L. -lwiringPi -o crossComBinDemo2
交叉编译工具链 树莓关于IO口文件 -I wiringPi库头文件路径 -L wiringPi库
编译通过: