【Linux】软硬链接&动静态库

1.软硬链接

1.1见一见软链接

其中,ln是link的意思。s代表soft。file_target1.txt是普通文件。将file_soft.link链接到file_target1.txt上。

这张图片说明软链接也是独立的文件,因为它有独立的inode。

1.2见一见硬链接

先创建file_target2.txt。

建立硬链接

建立完成之后,我们发现硬链接和原文件的inode相同,并且后面的数字从1变成2了!

1.3结论

1.3.1软链接

1.软链接是独立的文件,因为有独立的inode number。

2.软链接的内容:目标文件所对应的路径字符串。

3.软链接十分类似于windows中的快捷方式。

所以软链接不是类似快捷方式,而是就是快捷方式!

1.3.2硬链接

硬链接不是一个独立的文件,因为它没有独立的inode number,它用的是目标文件的inode。

什么是硬链接:

1.硬链接就是文件名和inode的映射关系。

2.建立硬链接就是在指定目录下,添加一个新的文件名和inode number的映射关系!

3.建立硬链接后,把目标文件删除。这个操作相当于重命名。其实就是删除了文件名和inode number的映射关系而已。

4.属性中有一列数字,就是硬链接数。也是文件的磁盘级引用计数:有多少文件名字符串通过inode number指向目标文件的inode。

所以

任何一个目录,刚开始新建的时候,引用计数一定是2。因为有隐藏文件.(当前路径)。

目录A内部新建一个目录,会让A目录的引用计数+1,因为有隐藏文件..(上一级路径)。

总结:一个目录内部有几个目录:A目录的引用计数-2。

硬链接的用途:

1.构建Linux的路径结构,让我们可以使用.和..来进行路径定位。

2.用来做文件备份。在其他目录下建立目标文件的硬链接,这样即使目标文件被误删了,还能用硬链接找到目标文件!

硬链接注意事项:

用户自己不能给目录建立硬链接,避免形成路径环绕。否则在ls一个目录的时候,遇到这个目录的硬链接时,又跳转回来了,是死循环。

但是.和..是目录的硬链接,所以Linux系统有特殊设置:在遇到.和..时不要有特殊操作了!

2.动静态库

2.1动态库

在Linux系统里,动态库一般以.so结尾。

在windows系统里,动态库一般以.dll结尾。

2.2静态库

在Linux系统里,静态库一般以.a结尾。

在windows系统里,静态库态库一般以.lib结尾。

2.3见一见库

新指令:ldd a.out,查看可执行程序所依赖的库。

这是一个软链接,真正的C语言库是libc-2.17.so。

要让我们的程序运行起来,第一需要a.out的可执行程序,第二需要库。这两个组合起来才是真正的可执行程序。

2.4关于库的理解

头文件是一个手册,提供函数声明,告诉用户怎么用。

.o提供实现,我们只需补上一个main,调用头文件提供的方法,然后和.o进行链接,就能形成可执行程序。

什么是库:

所谓的库文件,本质上就是把所有的.o(源文件编译形成.o文件)打包后形成一个库文件,这个库文件就是所谓的库。

为什么要有库:

提高开发效率。

生成静态库的指令:

在库中有很多.o文件,其中有个别.o文件可能会更新,这样我们需要重新打包形成库。r的意思就是在原来的库中的文件中,如果我们这次打包时有重复的,就替换。c的意思是不存在就创建。

静态库的命名:

以lib开头,中间的myc是库真正的名字,.a就是静态库的后缀。

什么是安装:

一般下载时,会下载一个压缩包,里面包含了头文件和库文件。

安装就是把下载好的文件拷贝到系统默认的搜索路径下,头文件拷贝到头文件的路径下,库文件拷贝到库文件的路径下。

安装好后,就可以把原来下载好的压缩包删掉了,当然不删也可以。

安装好后在编译时,如果我们只用了C标准库,就直接gcc main.c就能形成可执行程序。

但是我们如果用了第三放库(由第三方提供),就需要带-l选项,后面跟库真正的名字(就是去前缀,去后缀后 剩下myc)中间可以有空格,也可以没有。

因为gcc默认认识C标准库的,但是不认识第三方库,所以要加上。

什么是卸载:

卸载就是把头文件和库文件从系统路径中删掉。

如何在当前路径下使用静态库(不安装):

如果把第三方库安装到系统路径下是一种很不好的做法,能不能直接在当前路径下使用库呢?

可以!需要提供三个选项:

为什么不需要指定具体的哪个头文件呢?因为在main.c中已经指定了!这时可以用尖括号,我们告诉gcc的路径就相当于是系统路径了。

当然也可以不用指定头文件路径,但只能在mian.c中用双引号了,表示先去系统路径下找,没找到,再去双引号引起来的路径中去找。

但是库文件就必须要指定了!

静态链接:

带-static就是所有的库全部静态链接,就是把库中的实现方法拷贝到可执行程序中。

如果不带-static就是遇到动态库,进行动态链接,遇到静态库,进行静态链接。

形成动态库:

动态库是开发中用的最多的,有80%-90%。

先通过这条指令把源文件编译成.o文件。

把所有的源文件编译形成.o文件之后,编译器自己就支持打包动态库,只不过需要加上-shared选项。否则编译器就把它们编译形成可执行程序啦!(没有main函数就会报错)。

2.5动静态库加载时的区别

静态库:


执行这一条指令,形成的可执行程序就可以用了!因为在编译期间,以经将库中的代码拷贝到我们可执行程序内部了,加载时和库就没有关系了!

动态库:

动态库的加载就要复杂一点,在执行了静态库的那一条指令后,确实会形成可执行程序a.out,但这个可执行程序执行不了:

原因在于你只是把库的位置告诉了编译器,却没有告诉操作系统。因为动态库和可执行程序是有联系的,在程序运行时,操作系统需要找到动态库并加载。

解决方法:

方法一:

把动态库拷贝到系统的默认搜索路径下,我们之前的可执行程序不用重新编译,可以直接运行!这也证明了动态库和可执行程序有关联。

但上文也说了,不建议这样做。

方法二:

在系统默认搜索路径下建立一个软链接,链接到我们写的动态库上。这样程序就可以运行了!

方法三:修改环境变量

在Linux系统中,有一个环境变量是LD_LIBRARY_PATH,它标识了系统的默认搜索路径。

将我们写的动态库加上之后,程序就可以运行了!

但是环境变量只是内存级别的,下次登录又没了。想要永久有效,需要去修改配置文件中的环境变量。

重新登录,查看环境变量时,就自带了我们动态库的路径!

方法四:

这个路径下是系统的一些配置文件。

在这个路径下建立一个配置文件,后缀必须是.conf,其他的随意。

然后写上我们写的动态库的绝对路径,就OK了!

然后我们需要让配置文件生效:

在root权限下,执行ldconfig,意思是让

这条路径中的所有配置文件生效。

然后我们的可执行程序就可以顺利运行了!

总结:

2.6动态库VS静态库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

崽崽..

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

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

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

打赏作者

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

抵扣说明:

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

余额充值