首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

探索静态库与动态库的“奥秘”

探索静态库与动态库的“奥秘”

什么是库?

所谓“库”,就是稳定成熟的可以复用的代码;库从本质上来说是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

库有两种:静态库(.a(linux)、.lib(windows))和动态库(.so(linux)、.dll(windows))。

所谓静态、动态是指链接,可以看下编译链接的过程:

库与可执行文件区别

库文件无法直接执行,从生产库的源码中可以查看出,源码是没有函数,都是一些函数模块的定义和实现,由于没有主入口,所以无法直接运行库。

静态库是什么?

静态库实际就是一些目标文件(一般以结尾)的集合,静态库一般以结尾,只用于链接生成可执行文件阶段。这里注意区分下环境下是以结尾的,而环境下是以结尾的(我这里就使用版本进行,文章就主要以环境进行撰写)

在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库;

特点:

可执行文件中包含了库代码的一份完整拷贝

缺点:

缺点就是被多次使用就会有多份冗余拷贝。

静态库对程序的更新、部署和发布页会带来麻烦。如果静态库更新了,所以使用它的应用程序都需要重新编译、发布给用户;

静态库生成

创建静态库的步骤:

写源文件,通过 生成目标文件。

用 归档目标文件,生成静态库。(ar cr libhello.a hello.o)

使用静态库中函数的头文件。

使用静态库时,在源码中包含对应的头文件,链接生成的静态库。

生成静态库案例

文件:

制作动态库:

先编译生成链接文件

归档,生成静态库

函数调用

链接

通过使用makefile做到自动化

使用会构建出,使用生成可执行文件;

动态库是什么?

下动态库文件的文件名形如 ,其中so是 Shared Object 的缩写,即可以共享的目标文件。

动态库**在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。

特点:

使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本

优点:

节省了内存

动态库生成

创建动态库的步骤:

编写源文件。

将一个或几个源文件编译链接,生成共享库。

通过 的选项链接生成的。

把放入链接库的标准路径,或指定 ,才能运行链接了的程序。

生成动态库案例

还是上面的代码,这里直接使用上面的代码进行动态库的生成和使用

制作动态库:

先编译生成链接文件

创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。

生成动态库(链接器选项-shared)

其实可以一步就生成:

函数调用

我们发现,明明我们的动态库就在当前目录下,为什么会找不到呢?

如何让系统能够找到它:

编辑/etc/ld.so.conf文件,加入库文件所在目录的路径

运行ldconfig ,该命令会重建/etc/ld.so.cache文件

如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。

如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下:

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统动态载入器(dynamic linker/loader)。

对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib 目录找到库文件后将其载入内存。

我们直接将我们生成的文件拷贝至下,再次运行:

当然,加载动态库不止这一种方式,我们代码中往往使用的是一些函数,具体会出一篇文章,先做个插曲~

小插曲(常用参数)

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,拿数学库来说,它的库名是m,它的库文件名是,很容易看出,把库文件名的头和尾去掉就是库名了。

-L参数跟着的是库文件所在的目录名。比如我们把放在目录下,那链接参数就是另外,大部分只是一个链接;

用来包含头文件,但一般情况下包含头文件都在源码里用实现,参数很少用。参数是用来指定头文件目录,目录一般是不用指定的,知道去那里找,但是如果头文件不在里我们就要用参数指定了,比如头文件放在目录里,那编译命令行就要加上参数了,如果不加你会得到一个的错误。参数可以用相对路径,比如头文件在当前目录,可以用来指定;

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201024A02LFG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券