交叉编译说明:工具链安装和环境变量配置

18 篇文章 1 订阅
8 篇文章 1 订阅

目录

一   简单了解交叉编译

① 什么是交叉编译

② 为什么需要交叉编译

③ 宿主机和目标机

二   搭建交叉编译工作环境

① 安装工具链

② 配置环境变量

● 配置临时环境变量

● 配置永久环境变量

三   交叉编译宿主机和目标机

● 宿主机编译生成的可执行文件下载到目标机(开发板)

四   交叉编译带wiringPi库的程序

● 将树莓派中自带的wiringPi库下载到Ubuntu或宿主机中

五   软链接和硬链接 

① 软链接

② 硬链接 

六   结合四和五进行编译


一   简单了解交叉编译

① 什么是交叉编译

(1)编译:是在一个平台上生成在该平台上的可执行代码

(2)交叉编译:是在一个平台上生成另一个平台上的可执行代码。

● 我们再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/share/tools-master.zip .//我的共享文件名是share

(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)  ls -l 查看bin目录底下各文件权限,arm-linux-gnueabihf-gcc作为软连接,实际用到的可执行程序是它后面的arm-linux-gnueabihf-gcc-4.8.3

(7)指令arm-linux-gnueabihf-gcc -v 检查交叉工具链是否是4.8.3版本

② 配置环境变量

临时:只在当前页面有效,风险性高,离开当前页面又需要重新配置;

永久:任何页面或路径下都有效,安全可靠

(1)Linux环境变量的作用和配置方法其实和Windows的环境变量一样,不一样的只有界面而已;

(2)在上面操作交叉编译工具链可以看到,要使用工具链就必须进入层层目录,繁琐且麻烦,降低开发效率;

(3)配置环境变量就能很好的解决这一问题;

● 配置临时环境变量

(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/dhw/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/dhw/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

(2)source /home/dhw/.bashrc  加载配置文件,马上生效配置。

三   交叉编译宿主机和目标机

❄检查交叉编译工具链:arm-linux-gnueabihf-gcc -v

❄在Ubuntu上编写一个简单的程序:程序的文件名为:demo1.c

● 常规编译: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 pi@192.168.x.xxx:/home/pi

指令 文件名 开发板用户名@开发板地址:开发板的绝对路径

❄ 此方法也可以将目标机文件传至宿主机

四   交叉编译带wiringPi库的程序

说明:在树莓派中编写带wiringPi库的程序时(比如IO口),直接在程序中加头文件#include <wiringPi.h>,在编译的时候-l链接wiringPi库即可,因为树莓派自带有wiringPi库,在/usr/lib目录下。在Ubuntu中或者宿主机中没有自带wiringPi的库,那么很明显无法顺利完成带wiringPi库程序的交叉编译。

● 将树莓派中自带的wiringPi库下载到Ubuntu或宿主机中

①  cd /usr/lib  :树莓派wiringPi库的文件路径;

②  ls -l |grep wiringPi :过滤出只有wiringPi库的相关文件

③ 将软链接libwiringPi.so指向的libwiringPi.so.2.50下载到Ubuntu或宿主机中:

scp libwiringPi.so.2.50 dhw@192.168.x.x:/home/dhw/lessonPI
指令 需要拷贝的文件名    目标用户名  ip     拷贝的目标路径

注意:这里要拷贝软连接指向的文件,如果直接拷贝软链接到Ubuntu,Ubuntu里并不会生成我们要的软链接。

那么需要自己来生成软链接!具体如下:

五   软链接和硬链接 

① 软链接

● 软链接文件有类似于Windows的快捷方式;

● 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息;

● 在选定的位置上生成一个文件的镜像,不会占用磁盘空间。

生成方法:

ln -s libwiringPi.so.2.50 libwiringPi.so
指令 参数 要被链接的文件    要生成的软链接文件名字

② 硬链接 

在选定的位置上生成一个和源文件大小相同的文件

● 硬链接通过索引节点来进行链接;在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接

允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放,也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

生成方法:

ln libwiringPi.so.2.50 libwiringPi.so 
没有参数 -s

❄ 无论是软链接还是硬链接,文件都保持同步变化

六   结合四和五进行编译

编译时通过-I -L来指定相关库的路径

● -I (注意是大写的i) 给gcc添加自定义的头文件的路径

● -L 给gcc添加额外的搜索库的路径

说明:将树莓中名为demo2.c的程序文件拷贝到Ubuntu中,demo2.c是需要连接wiringPi库使用的程序;-I的wiringPi库的头文件是自行网上下载的wiringPi库的包;-L的wiringPi库是树莓拷贝到Ubuntu中的 。

arm-linux-gnueabihf-gcc demo2.c -I /home/dhw/lessonPI/WiringPi/WiringPi/wiringPi -L. -lwiringPi -o test
交叉编译工具链     树莓关于IO口文件   -I wiringPi库头文件路径                     -L wiringPi库

 编译通过:

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D.•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值