您好,欢迎来到刀刀网。
搜索
您的当前位置:首页【Linux】动静态库

【Linux】动静态库

来源:刀刀网

 


动静态库的简单理解

那么我们用到的库分为两种,静态库动态库;链接方式于是就分为了动态链接静态链接

静态链接则是直接把库拷贝到可执行程序中,这就使可执行程序在运行时不需要库了

因为动静态库的差异,它们是有各自的优缺点的

动态库:

        优点:比较节省资源,不会出现太多的重复代码(这里的资源可不仅仅指的是磁盘资源,还有运行时的内存资源,传输时的网络资源)

        缺点:对库的依赖性强,一旦少了这个库,不仅用到这个库的目标文件无法链接成可执行程序并且用到这个库的可执行程序也无法运行

静态库:

        优点:不依赖库,同类型平台都可以运行使用

        缺点:可执行程序体积比较大,比较浪费资源

动静态库在不同的操作系统下后缀也是不一样的

LinuxWindows
动态库.so.dll
静态库.a.lib

我们在gcc/g++下是默认使用动态链接的,有一个命令可以查看文件依赖的库ldd+文件名),还有一个命令可以查看文件的具体信息file+文件名),当然了,我们如果想使用静态链接的话也是有命令的,gcc后加选项-static,我们下面来试验一下两种链接方式有什么区别

有的云服务器是默认没有静态库的,我们要用yum安装一下静态库

yum install -y glibc-static libstdc++-static

我们安装完之后可以在下面的路径看到,安装的就是libc.a

这是我将test.c用两种链接方式形成的可执行程序,可以看到静态链接形成的可执行程序是比较大的,因为它并不需要依赖别的文件了

也可以看到动态链接确实是需要依赖一些库的,而静态链接不需要

也可以看到,画起来的部分确实写得是静态链接,而上面写的是动态链接

并且我们要知道库的真实名字是去掉前面的去掉前面的lib和后面的后缀,比如

就是libc.a,其实真实名字就是c

就是libldap-2.4.so.2.10.7,真实名字就是ldap-2.4

自己简单制作动静态库

静态库的制作

因为静态库只有在链接的时候使用,而动态库在链接和运行的时候都需要使用,所以对于静态库的制作和制作中出现的一些问题是动态库制作过程中问题的子集,所以我们先简单的来制作一下静态库

我们先来简单的理解一下有关库的问题,我们写库的人一般写多组头文件和源代码文件,我们一般不想把源代码透露出去,所以让源代码文件先进行编译(预处理,编译,汇编)环节形成多个目标文件,我们当然可以把头文件(含有函数的声明,即告诉用库的人如何使用)和目标文件全给用库的人,但是文件太多容易丢失,所以要将目标文件打包成库,形成一个库文件在给用户使用。那么我们就来简单的实现一下这个过程:

比如我现在已经写好了头文件和源代码文件,然后编译一下源文件

现在我就可以对于目标文件进行打包了,用下面的创建静态库的命令,在这个命令中,r表示插入新的成员,c表示创建新的库文件

所以我们需要通过如下的命令指明静态库的路径和名称,其中-L选项指定库文件所在的路径,-l选项指定要链接的库文件名称(省略lib前缀和.a后缀)

动态库的制作

动态库的制作也是先生成目标文件,然后打包目标文件成为动态库,但是指令会有所不同

shared表示生成共享库格式,也就是指明要生成动态库

然后我们下面就像创建静态库时那么做,生成了一个可执行文件

这个可执行文件如果时静态链接就已经可以运行了,但是动态链接不可以

因为前边说过动态链接的话编译和运行阶段都需要动态库(编译是gcc需要,运行是操作系统需要),现在运行的时候它找不到动态库

我们有这么几种方法:

1.直接将自己写的库安装(拷贝)到系统中

2.有这样一个环境变量

它里面放的就是系统运行程序时,动态库查找的辅助路径,所以我们可以把自制的动态库的路径添加到这个环境变量中

3.通过建立软链接的方式,就是将默认路径下创建一个与自制的动态库进行软链接的文件

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务