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,意思是让
这条路径中的所有配置文件生效。
然后我们的可执行程序就可以顺利运行了!
总结: