一、继续上一篇博文遗留的问题
在上一节的博文中,我们已经找到了带有wiringPi库的交叉编译不通过的原因了,那么现在我们斗胆来解决一下这个问题。
解决方法:(用树莓派上的wiringPi
库来用)
既然那个库不是树莓派平台的,那么我们就斗胆的从树莓派把那个库拿来用一下看看可不可以
- 先进入树莓派
wiringPi
库所在目录
cd /usr/lib/
进来之后我们看到太多东西了,我们要巧用grep
指令进行查找
- 巧用
grep
指令进行查找
ls -l | grep wiringPi
在上图中黄框内的那个文件才是我们真正的要的文件,从图中我们还发现红框内还有一个箭头,这个箭头的意思是软链接的意思,意思是我们要用的库是第一个黄框内的东西,但真正起作用的是第二个带有版本号2.50
的那个东西,那么我们斗胆把这两个文件拿到虚拟机上看看能不能用。
- 在2的基础上我们已经把
libwiringPi.so
和libwiringPi.so.2.50
这两个文件已经拿到虚拟机底下了
我们再来用指令:ls -l | grep wiringPi
看一下两者有什么不一样
从上图中我们可以清楚的看出把文件移动到虚拟机底下依然是用不了的,为什么呢,因为那个箭头消失了,意思就是软链接消失了,这样就用不了了,那该怎么办呢?自己创建新的软链接咯!
二、软硬链接的创建(面试的时候注重回答下面标有深红色的句子)
概念:
4. 软链接(重点理解)
软链接也称为符号链接(Symbolic Link),软链接文件类似于windows的快捷方式
,它实际上是一种特殊的文件,在符号链接中,文件实际上是一个文本文件,其中包含的有另一个文件的位置信息。
5.硬链接(少用,简单理解一下即可)
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软硬链接的创建:
ln -s
是linux
中一个非常重要命令,一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s
具体的用法:
ln
-s
源文件 目标文件
软链接的意义 :当我们在不同的目录,需要用到相同的文件时,我们不需要在每一个目录下都放一个相同的文件,我们只要在某个固定的目录下,放上该文件,然后在其他目录下用软链接的方式(即 ln -s xxx xxx
),链接它就可以,不必重复的占用磁盘空间。
例如:ln -s /lessonPi/libwiringPi.so.2.50 libwiringPi.so
以上指令的意思就是为在目录lessonPi
底下的源文件libwiringPi.so.2.50
创建在当前目录下的软链接
-s
是代号(symbolic
)的意思
在这里我们需要注意的有两点:
第一(同步性):ln指令会保持在每一处链接文件的同步性,也就是说,无论你修改了哪一处,其他的文件都会发生相同的变化;
第二:我们知道ln
指令的链接既有软链接也有硬链接,软链接的用法就是ln -s xxx xxx
,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间
(所以在这里应该可以理解上面所说的相当于是windows的一个快捷方式);硬链接的用法是ln xxx xxx
,没有参数-s
,它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都会保持同步变化
三、使用软链接解决wiringPi
库的交叉编译问题
a.通过指令
arm-linux-gnueabihf-gcc demo1.c -I /home/CLC/lessonPi/WiringPi/WiringPi/wiringPi -L . -lwiringPi -o cross
发现是可以交叉编译通过了并生成了可执行文件cross
,所以我们这样就完成了带wiringPi
库的交叉编译
b.那么现在我们把文件发送到树莓派上看看是否可以执行起来
chmod +x cross 给予可执行文件cross可执行的权限
关闭开关(off)是高电平,导通开关(on)是低电平
所以我们可以在树莓派上通过gpio readall
查看相关的引脚状态
由下图中我们可以看到对应着上面的第一次输入off
,1
即是高电平的意思
下图是对应着第二次输入on,0
是低电平的意思
所以由以上结果我们可以知道通过软链接的创建是可以解决掉wiringPi
库的交叉编译问题
总结:
我们纵览全程,我们解决wiringPi
库在linux
虚拟机上的交叉编译,最主要的依然是我们是从树莓派上拿了wiringPi
库来用,把树莓派下的libwiringPi.so.2.50
拿到虚拟机上,然后再为这个带有版本号的库创建一个软链接,然而我们最开始拿进虚拟机里的第三方的wiringPi
库只是解决了提供<wiringPi.h>
这个头文件而已,所以通过拿树莓派上的wiringPi
的库来创建软链接来用也是一种解决方法,但是我们不可能每次要用的时候都是从树莓派上拿吧,所以我们可以自己正常的进行交叉编译wiringPi
库,编译出适合树莓派上用的库,关于如何编译,在以后的博文会记录到,到现在为止,懂得通过在树莓派上拿库来用已经足够了
四、在学习交叉编译过程中涉及到的其他知识
- 首先我们先来简述一下可移植性高是怎么理解
一段代码通过不同的编译工具,编译后可以跑在不同的平台上,不需要每一次都修改特别多的代码
2.巧用grep
和history
和管道,以下两个指令在以后的工作中会经常用到,所以要熟练一下
grep gcc * -nir
上面的语句的意思是在当前的目录下,去查找带有
gcc
的所有文件
grep:这个指令可以理解成查找的意思
*
是所有文件的意思
n
:显示行号
i
:不区分大小写
r
:递归,即一个一个目录的搜索下去
history | grep demo1
意思是以history指令得到结果作为源,通过管道流向grep,grep就在这个源中去检索有关demo1的语句
history:这个指令是列出所有输入的操作过的指令的信息
|:
这个竖杠是管道的意思
grep
:查找,检索
demo1
:要检索的目标字眼,也可以是其他东西,在这里只是举一个例子而已
以上内容主要讲解了软硬链接的创建以及使用
学习笔记,仅供参考