西安市网站,深圳外贸进出口公司排名,常用的cms建站系统,德州定制网站建设公司一、Linux中的链接文件
1.1硬链接及应用场景
ln//创建硬链接 我们再创建一个硬链接生成的文件。
我们可以看到mlink.hard的inode和makefile.c的inode都是一样的#xff0c;inode一样里面的数据自然也是一样。相当于对make.file进行了一个重命名#xff0c;所以硬链接一定没…一、Linux中的链接文件
1.1硬链接及应用场景
ln//创建硬链接 我们再创建一个硬链接生成的文件。
我们可以看到mlink.hard的inode和makefile.c的inode都是一样的inode一样里面的数据自然也是一样。相当于对make.file进行了一个重命名所以硬链接一定没有新建文件因为其没有新建inode所以硬链接新建的是文件名和源文件的inode建立了个映射关系。
也就变成了有两个文件名和一个inode建立了映射关系。
而权限之后的数字就是硬链接数硬链接本质上就是在指定目录下插入新的文件名和目标文件的映射关系并让inode的引用计数每次创建一个硬链接就。
可我们可以发现我们新建的文件默认硬链接数是1这个1就是路径下的. 而当我们新创建一个文件夹4.5时会发现硬链接数为2。因为除了自身文件名和inode对应在此当前目录下包含.文件作为硬链接链接到自己。 此外可以看到创建了4.5这个目录后2024.4目录的硬链接数就变为了3这是因为首先是2024.4指向inode然后是目录下的.然后还有刚刚创建的4. 5中的..
这就是我们cd..可以回到上级目录的原因因为..作为上级目录的硬链接指向其inode我们还可以看到2024.4目录下的..硬链接数为9~目录的硬链接数为9。
所以一个目录下有多少个子目录可以通过硬链接数-2得到。
注意Linux中不允许用户给目录建立硬链接比如在一个目录下建立一个dir硬链接链接到根目录那我们在寻找查询一个文件的时候查询到dir就会回到根目录形成环路问题也就是无穷的循环递归现象。除非系统自己建立只要建立硬链接不管是.还是..都会形成环路问题而.和..已经被系统做了特殊标识操作系统会对.和..做特殊处理而如果让用户自己建立操作系统就无法辨别。
1.2软链接及应用场景
ln -s//建立软链接 mlink.soft本质上是一个文件。
ll -li我们可以看到mlink.soft有自己的inode。
软链接本质就是一个独立的文件软链接里面放的是目标文件的路径就类似于windows中的桌面快捷方式。 软链接可以指向比较深的文件路径直接./直接就可以运行或操作目标文件。 可以看到有很多软链接 。
二、动静态库 2.1什么是动静态库
ldd XXX//查看文件链接哪一个动态库 库被分为两种动态库后缀为.so静态库(后缀为.a)。
一般云服务器都是默认安装动态库生成可执行程序时也是默认链接动态库。
我们每次生成的可执行程序都用到了Linux中的C/C的动态库。 我们可以通过gcc 文件名 -static 的方式来链接静态库静态链接的可执行程序的大小是比动态链接的可执行程序是要大很多的。 一般判断一个库的名字都是去掉前缀lib去掉后缀so.剩下的就是它的名字比如libc.so.6去掉前后缀就是c所以这就是我们的c语言的库。
2.2静态库的制作和使用
所以为什么要有库呢
1.基于已经实现的库可以提高开发效率
2.隐藏源代码
[rootlocalhost linux]# ls
add.c add.h main.c sub.c sub.h
[rootlocalhost linux]# gcc -c add.c -o add.o
[rootlocalhost linux]# gcc -c sub.c -o sub.o
生成静态库
[rootlocalhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具rc表示(replace and create)
查看静态库中的目录列表
[rootlocalhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息
[rootlocalhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后静态库删掉程序照样可以运行
所以库的本质就是把一堆.o打包形成一个文件然后通过头文件来调用库。注意库中不能包含main函数。 这里将mymath.o和mystdio.o打包形成名为libmyc.a的静态库我们可以直接将头文件和.o文件传输给其他人别人就可以在main函数中进行包含使用当然如果直接用gcc编译的话会报错因为gcc默认使用libc.so.6的库编译器默认去lib64路径下去找库此时肯定是找不到的。 需要gcc源文件然后链接自己构造的库-l链接文件名-L .表明库文件在当前路径下。然后可以编译成功。
2.3动态库的制作和使用
gcc -c -FPIC文件名//形成同名的.o
gcc -o -shared libXXX.so XXX.o XXX.o//形成名为XXX的动态库 shared: 表示生成共享库格式 fPIC产生位置无关码(position independent code) 库名规则libxxx.so 也可以通过makefile文件来进行生成目标文件 补充$是将依赖文件依次执行指令。也可以向下面这样写将所有.c结尾的编译成同名.o 所以一个编写库的人未来交给别人的 我们也可以通过output将文件创建打包到一个目录下不同类型的文件打包到不同的子目录下。 之后就可以直接将压缩包mylib.tgz上传转移等操作 之后拿到压缩包的人直接进行解压操作就可以拿到文件。 而在直接编译刚刚自己写的第三方库时编译器会进行报错无法查找到mymath.c。因为编译器在编译时1.默认会到include所在路径下去找2.在当前路径下找而头文件我们刚刚将其封装在了lib目录下所以无法查找。 -I就是告诉编译器目标头文件在哪个路径下。
可是这种编译方式及其的繁琐复杂这时可以采用更好的方式将include目录和lib目录分别拷贝到include和lib64这样的系统指定的路径中所以所谓的把库、软件安装到系统中本质就是将对应的文件拷贝到系统指定的路径中一般都是系统。 像类似与stdio.h等都在include路径下。
所以像节省编写时的繁杂操作我们可以直接将相关文件拷贝到系统指定的路径下。 但编译形成可执行程序后./去运行发现依然会报错。
因为对于动态库来说
编译时的搜索路径为gcc
运行时的库搜索路径为os
两个路径可以一样但对于自定义的库需要用户即告诉编译器又告诉操作系统。
如果不想每次都手动去链接使用有以下四种方法来解决
1.将自定义库和cp拷贝到系统库/lib64,既可以支持编译又可以支持运行。
2.使用环境变量
系统程序运行时 动态库查找的辅助路径将不在系统默认搜索路径下的库路径添加到LD_LIBRARY_PATH中。 3.在系统库下建立软链接 4.通过系统的配置文件路径的方案 推荐第一种和第三种方法较为方便快捷。 当自定义静态库和动态库都存在且在同一路径下时 ./运行时优先默认使用动态库。
如果非要静态链接必须使用static选项如果只能对该库进行静态链接但是程序不一定整体是静态链接的。
如果只提供动态库默认只能动态链接非得静态链接会发生链接报错。