dll与lib
lib(静态数据连接库)
含义
LIB有两种,一种是静态库,比如C-Runtime库,这种LIB中有函数的实现代码,一般用在静态连编上,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了。一种LIB是和DLL配合使用的,里面没有代码,代码在DLL中,这种LIB是用在静态调用DLL上的,所以起的作用也是链接作用,链接完成了,LIB也没用了。
-
静态库的lib:
该lib包含函数的代码本身(包括函数的索引,也包括实现),在编译 的时候将代码加入程序当中
-
动态库的lib:
该lib包含了函数所在的DLL文件和文件中函数位置的信息,函数实现代码由运行的时候加载在进程空间中DLL提供
使用方法
静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这种静态库工程时,不会遇到链接错误;即使有错,也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。
在VC中新建一个static library类型的工程Lib,加入test.cpp文件和test.h文件(头文件内包括函数声明),然后编译,就生成了Lib.lib文件。
特点
-
静态库对函数库的链接是放在编译期完成的,程序在运行的时候与函数库再无瓜葛,移植方便。
-
浪费空间与资源,因为所有相关的目标文件与牵扯到的函数库会被合成一个可执行的文件
-
可执行文件中包含了库代码的一份完整拷贝
-
被多次使用就会有多份冗余拷贝
dll(动态链接库)
含义
.dll,动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。DLL不是可执行的文件,动态库提供一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL中包含一个或者多个已经被编译,链接并使用它们的进程分开存储的函数,在vs中新建生成动态库的工程,编译成功后,产生一个.lib和一个.dll文件。
使用方法
使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它只是提供动态链接到DLL所需要的信息,这种lib可以在编译一个DLL工程时由编译器生成。
特点
-
把一些库函数的链接载入推迟到程序运行的时期,可以实现进程之间的资源共享。将实现进程之间的资源共享,将一些程序升级变得简单。
-
可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
-
使用较少的资源,当多个程序使用同一个函数库时,dll 可以减少在磁盘和物理内存中加载的代码的重复量。
两者区别
使用场景不同
lib是编译时用到的,dll是运行时用到的。
如果要完成源代码的编译,只需要 lib;如果要使动态链接的程序运行起来,只需要dll。
用途不同
一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。
如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位 置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。
使用静态编译的lib文件,在运行程序时 不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才可以。
应用对象不同
动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL 文件。
在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。
DLL和LIB文件必须随应用程序 一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。