C++静态库与动态库深入研究——动态库篇!

本文深入探讨C++动态库,解释为何需要动态库以解决静态库的空间浪费和更新难题。介绍了Linux和Windows下创建及使用动态库的步骤,包括Linux的soname、动态加载器的工作原理,以及Windows下的DllMain函数。动态库延迟链接和资源共享特性使其成为程序升级和代码复用的有效手段。
摘要由CSDN通过智能技术生成

一、动态库

通过之前静态库那篇文章的介绍。发现静态库更容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?

 

1、为什么还需要动态库?

为什么需要动态库,其实也是静态库的特点导致。

▶ 空间浪费是静态库的一个问题。

▶ 另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。

动态库特点总结:

    ✪ 动态库把对一些库函数的链接载入推迟到程序运行的时期。

    ✪ 可以实现进程之间的资源共享。(因此动态库也称为共享库)

    ✪ 将一些程序升级变得简单。

    ✪ 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。

    ✪ 在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。

    ✪ Linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

与创建静态库不同的是,不需要打包工具(ar、lib.exe),直接使用编译器即可创建动态库。

 

2、Linux下创建与使用动态库

linux动态库的命名规则为:

动态链接库的名字形式为 libxxx.so,前缀是lib,后缀名为“.so”。

    ✪ 针对于实际库文件,每个共享库都有个特殊的名字“soname”。在程序启动后,程序通过这个名字来告诉动态加载器该载入哪个共享库。

    ✪ 在文件系统中,soname仅是一个链接到实际动态库的链接。对于动态库而言,每个库实际上都有另一个名字给编译器来用。它是一个指向实际库镜像文件的链接文件(lib+soname+.so)。

 

3、创建动态库(.so)

编写四则运算动态库代码:<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值