1:神马是Dll和Lib,神马是静态连接和动态连接函数
你们都懂的,DLL就是动态连接库,LIB是静态连接库。DLL其实就是EXE,只不过没main。spa
动态连接是相对于静态连接而言的。所谓静态连接就是把函数或过程直接连接到可执行文件中,成为可执行程序中的一部分,当多个程序调用一样的函数时,内存里就会有这个函数的多个拷贝,浪费内存资源。而动态连接则是提供了一个函数的描述信息给可执行文件(并无内存拷贝),当程序被夹在到内存里开始运行的时候,系统会在底层建立DLL和应用程序之间的链接关系,当执行期间须要调用DLL函数时,系统才会真正根据连接的定位信息去执行DLL中的函数代码。版本控制
在WINDOWS32系统底下,每一个进程有本身的32位的线性地址空间,若一个DLL被进程使用,则该DLL首先会被调入WIN32系统的全局堆栈,而后经过内存映射文件方式映射到这个DLL的进程地址空间。若一个DLL被多个进程调用,则每一个进程都会接收到该DLL的一个映像,而非多份的拷贝。但,在WIN16系统下,每一个进程须要拥有本身的一份DLL空间,能够理解为什么静态连接没啥区别。索引
2:DLL和LIB区别和联系。进程
DLL是程序在运行阶段才须要的文件。内存
LIB是程序编译时须要连接的文件。ci
DLL只有一种,其中必定是函数和过程的实现。资源
LIB是有两种。若只生成LIB的话,则这个LIB是静态编译出来的,它内部包含了函数索引以及实现,这个LIB会比较大。若生成DLL的话,则也会生成一个LIB,这个LIB和刚才那个LIB不一样,它是只有函数索引,没有实现的,它很小。可是这俩LIB依然遵循上个原则,是在编译时候是须要被连接的。若不连接第一个LIB的话,在程序运行时会没法找到函数实现,当掉。若不连接第二个LIB的话,在程序运行时依然会没法找到函数实现。但第二种LIB有一种替代方式,就是在程序里,使用LoadLibrary,GetProcAddress替代第二个LIB的功能。第一种LIB生成的EXE文件会很大,由于LIB全部信息被静态连接进EXE里了。第二种LIB生成的EXE文件会比较小,由于函数过程实现依旧在DLL内。开发
咱们能够将静态编译的LIB称为 静态连接库。但动态编译的LIB称为 引入库。可能会比较好一些。编译
静态连接LIB的优势是免除挂接动态连接库,缺点是EXE大,版本控制麻烦些。
动态连接DLL的优势是文件小,版本更换时换DLL就行了,缺点是多了点文件。动态连接如果被多个进程使用,会更加方便和节省内存。
3:为何编译DLL时总会同时生成一个LIB?这个LIB有用吗?
若咱们不是用静态连接,而使用DLL,那么咱们也须要一个LIB,这个LIB的做用是被连接到程序里,在程序运行时告诉系统你须要什么DLL文件。这个LIB里保存的是DLL的名字和输出函数入口的顺序表。它是有意义的。
固然,若咱们的应用程序里不连接这个LIB,则可使用LoadLibrary,GetProcAddress来告诉系统咱们在运行时须要怎么着DLL以及其内的函数。
4:DLL意义。
1:DLL真正实现了跨语言。各类语言均可以生成DLL,而对系统以及应用程序来讲,哪一种语言生成的DLL是没有区别的。
2:DLL有足够的封装性,对于版本更新有很大好处。由于DLL是运行期间才会使用,因此,即便DLL内函数实现有变化(只要参数和返回值不发生变化),程序是不须要进行编译的。大大提升了软件开发和维护的效率。
3:DLL被多个进程使用,由于有内存映射机制,无需占用更多内存。