动态链接库与静态链接库

13 篇文章 0 订阅
 
 动态链接库静态链接库
生成的文件不同*.dll   *.lib*.lib
文件功能

lib是编译链接时需要,dll是运行时需要的。如果要完成代码编译,有lib就行;如果使动态链接的程序运行起来,有dll就够了。

lib文件必须在编译器就连接在应用程序;

dll在运行期才会调用。

如果只有lib文件,则这个礼拜是静态编译出来的,索引和实现在其中。
共享代码的方式使用Dll不必被包含在最终exe文件中,exe执行时可以“动态”地引用和卸载这个与exe独立的dll文件。无论愿不愿意,lib中的指令都全部被直接包含在最终生成的exe文件中了。
包含库的情况可以再包含其他的动态或者静态的链接库不能再包含其他的动态链接库或者静态库。静态LIB生成过程是只编译不链接, 其实就相当于把CPP编译出来的OBJ,简单打包成一个文件。
生成lib的区别包含了函数所在DLL文件和文件中函数位置的信息,成为导出库。“动态的lib”相当于一个h文件,对实现部分(dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时需要相应的dll文件支持。包含了函数代码的本身。“静态的lib”将导出声明和实现都放在lib文件中。编译后所有代码都嵌入到宿主程序。通过#include包含这些函数的头文件后,应用程序就可以使用lib文件中的函数了。
lib文件与cpp文件的区别cpp文件是源代码,库文件是编译后的二进制代码,比如你可以调用Windows的API,但是不能看到其源代码一样。cpp文件是源代码,库文件是编译后的二进制代码,比如你可以调用Windows的API,但是不能看到其源代码一样。
调用方式两种隐式调用和显示调用包含即可使用
隐式调用

应用的情况:应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到exe文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址。(lib文件是必须的)

静态调用:方式的特点是由编译系统完成对DLL的加载和应用程序结束时 DLL 的卸载。当调用某DLL的应用程序结束时,若系统中还有其它程序使用该 DLL,则Windows对DLL的应用记录减1,直到所有使用该DLL的程序都结束时才释放它。静态调用方式简单实用,但不如动态调用方式灵活。

静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在 EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。


步骤:

   1、保证a.dll和a.lib两个文件都有

2、将要调用的函数的声明和下面的语句写到一个头文件中

#pragma comment(lib, "a.lib")   指定与静态库一起连接

显式调用

应用的情况:如果dll没有对应的.lib文件,那么就只能使用显示调用(动态加载)的方式了。

动态调用:方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。

动态调用动态库步骤:

1、创建一个函数指针,其指针数据类型要与调用的DLL引出函数相吻合。

2、通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄。

3、通过Win32 API函数GetProcAddress()获取要调用的DLL的函数地址,把结果赋给自定义函数的指针类型。

4、使用函数指针来调用DLL函数。

5、最后调用完成后,通过Win32 API函数FreeLibrary()释放DLL函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值