lib和dll文件的初了解

摘要:
Lib和dll很少出现在许多编程书中,但它们在实际项目中非常重要。我认为C++程序员需要知道这两件事。编译静态库时,将生成.lib文件。各种类型和函数的实现都加载在lib中。这个静态链接的库实际上是多个obj文件的集合。如果您只想更新其中的几个。dll,您可以减小更新的大小。


lib,dll这两样东西在许多编程书中都很少出现,但实际工程中,这两样东西的作用确实非常重要,我觉得c++程序员都有必要了解这两样东西。


首先总共有 动态链接 和 静态链接 这两种链接方式

|静态链接:

静态链接使用静态链接库lib,且只在源代码编译时用到(编译期)。
编译生成静态库时会生成一个.lib文件
.lib里面装载了各种类,函数的实现。
这种静态链接的lib实际上是多个obj文件的集合。

|为什么需要静态链接?

在实际工程中,往往各模块的规模庞大(一堆.h .cpp文件)
而编译时,每个.cpp对应生成.obj文件,一个模块生成一堆obj文件,然后分不清哪些obj是属于哪部分模块,造成维护的不便性
为了解决这问题,可以将每个主要模块先编译成一个.lib文件,再使用静态链接的方法,在编译期将各模块的.lib的文件链接起来。

|动态链接:

动态链接使用动态链接库dll,且只在程序启动时用到(运行期)
编译生成动态链接库时会生成一个.dll文件和一个.lib文件

.dll存放了各函数,.exe刚开始运行时就会动态链接上所需的.dll文件(运行期)

.lib则一般是一些索引信息,记录了dll中函数的入口和位置(跟静态链接库的lib不同),不过仍然只在编译期用到(编译期)

|为什么需要动态链接?

由于.dll存放了各函数,.exe里无需再存放.dll已含有的函数,只需调用时存放相应的函数地址,这样可以将.exe的空间大小转移一部分给.dll。
在大型软件的更新中,如果更新一个庞大的exe文件,负担想必是极大的。如果仅针对其中某几个.dll更新,则可以减少更新的大小。提高灵活性。
缺点还是有的,在程序刚开始运行时,程序会动态链接n个.dll,这个操作需要花时间。
(某些大型游戏,点开图标后,半天都不把程序弹出来,大概也有这个原因- -||)

免责声明:文章转载自《lib和dll文件的初了解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL在SQLAlchemy ORM中动态变更表名下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Centos 安装boost库

1.在http://www.boost.org/下载boost安装包boost_1_65_1.tar.gz 2.在Centos上解压tar -zxvf boost_1_65_1.tar.gz后,cd进入boost_1_65_1目录 3.安装boost库到指定目录 ./b2 install --prefix=/home/dj/lib/boost/  4.如果...

将Qt5.5 动态链接生成的exe及依赖dll打包方法

Qt静态编译链接生成的exe文件,不需依赖七大姑八大姨的一堆dll,可以独立运行,发布很方便。但绝大多数用的都是Qt开源版本,如果用静态链接,会有些限制。那有没有办法即能享受静态编译的方便,又不受开源许可的限制呢?方法之一,就是用动态编译,然后把exe和需要的dll整合成一个文件,问题就解决了。 使用工具: Enigmavb(单文件封装工具) 下载:htt...

002.使用kubeadm安装kubernetes 1.17.0

一 环境准备 1.1 环境说明 master      192.168.132.131      docker-server1 node1       192.168.132.132      docker-server2 node2       192.168.132.133      docker-server3 1.2 docker版本 [root@...

Ganglia3.1.7安装与配置(收录)

一、所需要软件 二、安装过程     1、Ganglia运行平台的安装     2、Ganglia依赖库的安装     3、RRDTool的安装     4、Ganglia的安装 (包括使用yum方式安装) 三、简单配置 四、启动与访问 五、被监控节点上安装Ganglia (包括使用yum方式安装) 六、遇到的问题,及解决办法    流行的开源服务器集群监...

MariaDB日志文件、备份与恢复

1. 数据库的6种日志        数据库有6种日志,分别是:查询日志、慢查询日志、错误日志、二进制日志、中继日志以及事务日志。 1> 查询日志   查询日志记录每一条sql语句,建议不开启,因为如果访问量较大,会占用相当大的资源,影响性能。 查询日志的开启:        编辑配置文件:/etc/my.cnf.d/server.cnf vim /...

shell三剑客之find

查找以ini结尾的文件[root@iZj6cbstl2n6r280a27eppZ app]# find / -name "*.ini"/app/myblog/config.ini exec解释:-exec 参数后面跟的是 command 命令,它的终止是以';'为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加...