Linux动静态库打包
Posted SuchABigBug
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux动静态库打包相关的知识,希望对你有一定的参考价值。
目录
一、软硬链接
-
软链接, ln -s
用后者去链接前者,soft_link就是一个普通的正常文件,有自己独立的inode编号,他的data block中保存的就是指向的文件对应的路径
类似于windows里的创建快捷方式,当我们把原来的文件删掉后,软链接soft_link找不到原来的地址 -
硬链接
我们发现后创建的硬链接hard_link没有自己独立的inode,都是786435,所以不是一个文件,只是依附于别人的一个文件,属性也是一模一样,hard link实际上只是建立了文件名和inode的映射关系
当我们删掉file.txt,hard_link里的内容是不会受到影响的
硬链接和软链接的区别:
软链接有自己的inode的编号,硬链接没有,可进行路径的快速切换
硬链接相当于文件的一个别名,好处是方便用户进行相对路径的路径设置
那么下图dir目录为什么是2,而file.txt是1呢?
file.txt是1好理解,就是包含的file文件名和inode编号的一组映射关系
还有一个是进到dir文件夹里面的,自己的目录文件名和相同的inode编号,我们就不需要说明dir/xxx.exe,就可以直接./xxx.exe或者直接运行xxx.exe运行
如果dir显示的是4,那么.和…占了两个,其他一定是文件夹。
注意硬链接文件hard_link和file.txt用的是同一个inode,并没有创建独立文件,本质上是当前目录下对应的目录数据区建立了新的文件名和inode的映射关系
二、动静态库
为什么需要使用动静态库呢? 为了开发效率和健壮性
- 库方式分动态库(libc.so),静态库(libc.a)
- 开源代码
- 基本的网络功能调用(各种网络接口,如语音识别)
我们看到libc.so.6,去掉前缀和去掉.之后的后缀就剩下c库。在Linux中默认情况下形成的可执行程序是动态链接的
举个例子:
- 动态库:小汪在家做作业(执行一个程序),发现不会做的题,没有手机情况下,问学长网吧在哪(链接的过程),去网吧查答案(调用库)
- 静态库:同样的如果你爸给你买了台笔记本电脑,就不需要去网吧了,也就是说把库里所有的功能拷贝到可执行程序里,这种方式就是静态链接
静态链接的方式是我们只需要在makefile里增加-static
这是由于个人用的云服务器,用yum安装静态库即可
动态链接的特点:体积小,节省资源(磁盘,内存)换言之一个动态库模块化之后可以被很多其他的代码使用直接调用即可,一旦丢失,bin不可执行
静态链接的特点:体积大,浪费资源,不依赖库,库丢失不影响
三、制作动静态库
3.1、静态库
我们想让别人用我们的库,要告诉别人能提供什么方法,通过头文件
下面是头文件和实现的方法
目前已经编译出libmymatch.a静态库
接下来我们要准备使用这个库
lib里面放的是方法的头文件,即Add.h和Sub.h
这里的(-I 也就是大i)指定头文件在哪里,需要提供路径在哪
这里的-L,指定我们生成的库路径在哪里
假如我们不说明头文件在哪里,而直接编译看看会发生什么错误
假如指明了库名的路径,却没有指明生成的静态库路径,下面会报的错误
指明了库名位置,指明了库路径,还是报错,这是因为没有带上库名
我们用-l(小写L),接上去掉前缀lib以及后缀.a,最终进行编译即可
3.2、动态库
gcc选项,fPIC产生与位置无关码
上面的-shard,体现在同一份代码,在内存中可以被映射到不同进程的共享区中,从而实现库的共享
我们发现至此和静态库的引入没有什么差别,但是当我们运行时会报错,这属于运行问题,要让系统帮我们找到运行时需要使用 的动态库!
当我们配置好之后,运行问题解决,找到了此动态库
由于每次打开后这个为空,因此我们需要更新到/etc/ld.so.conf.d/
ldconfig进行更新后,即可
*注意:我们lib文件夹里必须要包含libmymath.so才能调用到
如果三方库即有静态库也有动态库,可以用-static直接进行编译
创作不易,如果文章对你帮助的话,点赞三连哦:)
以上是关于Linux动静态库打包的主要内容,如果未能解决你的问题,请参考以下文章
Linux篇第十篇——动静态库(动静态库的介绍+动静态库的打包与使用)