Linux树莓派开发——交叉编译概述和工具链的使用,文件的软/硬链接,以及带wiringPi库的交叉编译

目录

一、交叉编译

1、什么是交叉编译

2、为什么要交叉编译

 3、树莓派也要交叉编译吗?

二、交叉编译工具链的安装

 三、工具链的使用

四、带WiringPi库的交叉编译

​ 五、软链接和硬链接

1、软链接

软链接的创建

2、硬链接

硬链接的创建


一、交叉编译

1、什么是交叉编译

        交叉编译就是在一个平台上生成另一个平台上的可执行代码,比如在windows(keil)上面编写C51代码,并编译成可执行代码(xx.hex),而代码的运行是在c51单片机上,而不是在windows上面运行,又比如在使用树莓派的时,代码一般是在ubuntu上面编写,而运行是在树莓派上面,不是在ubuntu 上面运行。

编译:在一个平台上生成在该平台上的可执行代码。

2、为什么要交叉编译

        平台上不允许或者不能够安装我们所需要的编译器比如C51,因为目的平台上的资源贫乏,无法运行我们所需要编译器

 3、树莓派也要交叉编译吗?

        虽然树莓派有操作系统,但是也要交叉编译的,因为有时目的平台还没有建立,操作系统都没有,所以谈不上运行什么编译器,操作系统也是需要编译的。

平台运行至少需要bootloader(启动引导代码)和操作系统核心

宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,也被称为主机
目标机(target):用户开发的系统,通常都不是X86的平台。host编译得到的可执行代码在target上运行。

二、交叉编译工具链的安装

下载地址:tools-master

 下载好这个文件后将文件从共享文件夹拷贝到Ubuntu工作目录来

cp /mnt/hgfs/share/tools-master.zip .

(当然了也可以用FileZilla 来进行文件的传输)

文件拿到后要进行解压,(如果在Windows那边解压好了的就不需要)

unzip tools-master.zip  //解压命令

解压完成后进入到文件里面,这里根据自己电脑的位数而进入相应的文件夹

cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-respbian-x64/bin

arm-linux-gnueabihf -gcc就是交叉编译的工具链,编译出的可执行文件是在目标机上面运行,而gcc编译出的可执行文件是在本地运行

如果想在使用工具链的时候不想打这么多文件路径的话,可以进行相关的配置,

(1)临时有效

通过配置环境变量来实现

echo $PATH :获得当前的环境变量(每个电脑值可能不一样)

然后使用pwd命令来显示当前的路径

 配置环境变量

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/lwl/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

但是这种方法只能是临时有效,当窗口关闭后,打开另外一个窗口时就失效。

(2)永久有效

通过修改工作目录下的.bashrc 隐藏文件,bashrc 是用来配置命令终端的

vi /home/lwl/.bashrc 

 

也就是将上面配置环境变量那一句添加到 .bashar文件的最后面,然后保存退出。

source /home/lwl/.bashrc 加载配置文件,马上生效配置。 

 三、工具链的使用

file + 文件是用来查看文件的属性的

 hello.c是一个输出“hello world”的c文件,可以看到用gcc编译的hello.c文件只能在x84-64上面运行,而用arm-linux-gnueabihf-gcc 编译的只能在ARM平台

hello_2这个可执行文件是不能在本机上面运行的,可以通过scp指令把它拷贝到树莓派上面去运行

scp hello_2 pi@172.20.10.2:/home/pi

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

然后在树莓派的home/pi路径下面会有一个hello_2的文件,用 ./hello_2 可以正常运行在树莓派上面

 这样就实现了在PC机上面编写,编译代码,在目标机上面运行代码。 

四、带WiringPi库的交叉编译

        如果直接安装wiringPi的库是只适用于X86平台,正常情况下,先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
通过-I -L来指定

编译指令:

arm-linux-gnueabihf-gcc demo2.c -I /home/lwl/lessonPI/WiringPi/wiringPi -lwiringPi

但是会报如下错误

/home/lwl/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
collect2: error: ld returned 1 exit status

这是因为链接的库的格式不正确,库是宿主机的平台(Windows)而不是ARM平台。

解决办法:树莓派的库拿来用

cd /usr/lib/

 将树莓派上面的WiringPi 库传到Ubuntu上面去

scp libwiringPi.so.2.50 lwl@127.0.0.1:/home/lwl/pi

注意:这里不需要将libwiringPi.so这个软链接拷贝到Ubuntu,因为这里经过scp拷贝时,软链接和库已经没有关系。

生成软链接:

将WiringPi从树莓派拷贝过来了,但是软链接没有拷贝过来,那就需要自己创建一个新的软链接。

ln -s libwiringPi.so.2.50 libwiringPi.so  //创建新的软链接

ln libwiringPi.so.2.50 libwiringPi.so  //创建硬链接,会在选定的位置生成一个和源文件大小相同的文件

ln -sf libwiringPi.so.2.50 libwiringPi.so //创建新的软链接,同时覆盖之前的软链接

指令 参数   要被链接的文件    软链接文件名字

这样就创建了一个名为libwiringPi.so的软链接。

 然后选择一个用wiringPi编写的.c文件进行编译

 

 编译成功,并生成了一个 名为 PI 的文件,并且文件的运行平台为ARM,通过scp命令将PI拷贝给树莓派,在树莓派上面运行,这样就完成了带有WiringPi库的交叉编译。

 五、软链接和硬链接

1、软链接

        软链接也叫符号连接(Symbolic Link)软链接文件类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。在选定的位置上生成一个文件的镜像,不会占用磁盘空间。

软链接的创建

ln -s  //功能是为某一个文件在另外一个位置建立一个同不的链接
具体用法是:ln -s 源文件 目标文件。

ln命令会保持每一处链接文件的同步性,也就是说不管改了哪一个文件,其他文件都会发生相应的变化。

2、硬链接

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

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

硬链接的创建

ln 源文件 目标文件 

比如 ln test2.sh test1.sh。这里test1.sh就是链接到了test2.sh脚本文件

硬链接会在你选定的位置上生成一个和源文件大小相同的文件。

从github.com/raspberrypi/tools完整下载的主分支,直接git太慢还容易失败,特意分享出来,实测在Ubuntu 18上安装x64工具链可用,gcc版本:4.8.3. 文件300M+,不能上传大于220M的,尝试过解压后分卷,会导致安装有问题,所以直接发一个链接,大家去那里下吧。 文件信息: └─tools-master ├─arm-bcm2708 │ ├─arm-bcm2708-linux-gnueabi │ │ ├─arm-bcm2708-linux-gnueabi │ │ │ ├─bin │ │ │ ├─debug-root │ │ │ │ └─usr │ │ │ │ └─bin │ │ │ ├─include │ │ │ │ └─c++ │ │ │ │ └─4.7.1 │ │ │ │ ├─arm-bcm2708-linux-gnueabi │ │ │ │ │ └─bits │ │ │ │ ├─backward │ │ │ │ ├─bits │ │ │ │ ├─debug │ │ │ │ ├─decimal │ │ │ │ ├─ext │ │ │ │ │ └─pb_ds │ │ │ │ │ └─detail │ │ │ │ │ ├─binary_heap_ │ │ │ │ │ ├─binomial_heap_ │ │ │ │ │ ├─binomial_heap_base_ │ │ │ │ │ ├─bin_search_tree_ │ │ │ │ │ ├─branch_policy │ │ │ │ │ ├─cc_hash_table_map_ │ │ │ │ │ ├─eq_fn │ │ │ │ │ ├─gp_hash_table_map_ │ │ │ │ │ ├─hash_fn │ │ │ │ │ ├─left_child_next_sibling_heap_ │ │ │ │ │ ├─list_update_map_ │ │ │ │ │ ├─list_update_policy │ │ │ │ │ ├─ov_tree_map_ │ │ │ │ │ ├─pairing_heap_ │ │ │ │ │ ├─pat_trie_ │ │ │ │ │ ├─rb_tree_map_ │ │ │ │ │ ├─rc_binomial_heap_ │ │ │ │ │ ├─resize_policy │ │ │ │ │ ├─splay_tree_ │ │ │ │ │ ├─thin_heap_ │ │ │ │ │ ├─tree_policy │ │ │ │ │ ├─trie_policy │ │ │ │ │ └─unordered_iterator │ │ │ │ ├─profile │ │ │ │ │ └─impl │ │ │ │ ├─tr1 │ │ │ │ └─tr2 │ │ │ └─sysroot │ │ │ ├─etc │ │ │ ├─lib │ │ │ ├─sbin │ │ │ └─usr │ │ │ ├─bin │ │ │ ├─include │ │ │ │ ├─arpa │ │ │ │ ├─asm │ │ │ │ ├─asm-generic │ │ │ │ ├─bits │ │ │ │ ├─drm │ │ │ │ ├─gnu │ │ │ │ ├─linux │ │ │ │ │ ├─byteorder │ │ │ │ │ ├─caif │ │ │ │ │ ├─can │ │ │ │ │ ├─dvb │ │ │ │ │ ├─hdlc │ │ │ │ │ ├─isdn │ │ │ │ │ ├─mmc │ │ │ │ │ ├─netfilter │ │ │ │ │ │ └─ipset │ │ │ │ │ ├─netfilter_arp │ │ │ │ │ ├─netfilter_bridge │ │ │ │ │ ├─netfilter_ipv4 │ │ │ │ │ ├─netfilter_ipv6 │ │ │ │ │ ├─nfsd │ │ │ │ │ ├─raid │ │ │ │ │ ├─spi │ │ │ │ │ ├─sunrpc │ │ │ │ │ ├─tc_act │ │ │ │ │ ├─tc_ematch │ │ │ │ │ ├─usb │ │ │ │ │ └─wimax │ │ │ │ ├─mtd │ │ │ │ ├─net │ │ │ │ ├─netash │ │ │ │ ├─netatalk │ │ │ │ ├─netax25 │ │ │ │ ├─neteconet │ │ │ │ ├─netinet │ │ │ │ ├─netipx │ │ │ │ ├─netiucv │ │ │ │ ├─netpacket │ │ │ │ ├─netrom │ │ │ │ ├─netrose │ │ │ │ ├─nfs │ │ │ │ ├─protocols │ │ │ │ ├─rdma │ │ │ │ ├─rpc │ │ │ │ ├─rpcsvc │ │ │ │ ├─scsi │ │ │ │ │ └─fc │ │ │ │ ├─sound │ │ │ │ ├─sys │ │ │ │ ├─video │ │ │ │ └─xen │ │ │ ├─lib │ │ │ │ └─gconv │ │ │ ├─libexec │ │ │ ├─sbin │ │ │ └─share │ │ │ ├─i18n │ │ │ │ ├─charmaps │ │ │ │ └─locales │ │ │ └─locale │ │ │ ├─be │ │ │ │ └─LC_MESSAGES │ │ │ ├─bg │ │ │ │ └─LC_MESSAGES │ │ │ ├─ca │ │ │ │ └─LC_MESSAGES │ │ │ ├─cs │ │ │ │ └─LC_MESSAGES │ │ │ ├─da │ │ │ │ └─LC_MESSAGES │ │ │ ├─de │ │ │ │ └─LC_MESSAGES │ │ │ ├─el │ │ │ │ └─LC_MESSAGES │ │ │ ├─en_GB │ │ │ │ └─LC_MESSAGES │ │ │ ├─es │ │ │ │ └─LC_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值