动态链接库和静态链接库的区别

两种库
一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。

一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。

(所以无论是动态链接库还是静态链接库,都会有lib文件)


两种链接方式
动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL中函数的可执行代码所需的信息。
静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。


静态链接库的使用:

  • 需要的文件: 头文件 .h 、静态库 .lib
  • 头文件.h中有函数的声明,使用静态链接库的项目需要引用该文件才能编译通过
  • .lib包含了实际执行代码、符号表等等
  • 加载lib的方法:  法1.使用编译链接参数或者VS的配置属性来设置    法2.使用pragma编译语句,例如pragma comment(lib,"a.lib")
  • .lib中的指令将全部被直接包含在最终生成的 EXE 文件中


动态链接库的使用:

一、动态库的隐示调用:

  • 需要的文件: 头文件 .h 、动态链接库的.lib文件,动态链接库的dll文件
  • 头文件.h和静态链接库使用时的作用一样,使用动态链接库中的函数的项目需要引用该文件才能编译通过
  • .lib包含了函数所在的DLL文件和文件中函数位置的信息,.dll包含了实际执行代码、符号表等等
  • 加载lib的方法:lib是编译链接是用的,跟使用静态链接库时一样有两种方法:法1.使用编译链接参数或者VS的配置属性来设置    法2.使用pragma编译语句,例如pragma comment(lib,"a.lib")
  • 加载dll的方法:dll是运行时用的,链接了lib之后形成的EXE可执行文件中已经有了dll的信息,所以只要把dll放在和exe同一个目录下就可以了,运行时根据EXE需要自动加载dll中的函数

二、动态库的显式调用:

  • 需要的文件: 动态链接库的dll文件
  • 不需要.h头文件和.lib文件,因为LoadLibrary之后可以使用getProcAddress来查找一个函数的地址从而调用该函数 (显式调用的前提是使用者需要知道想调用的函数的名字、参数、返回值信息,也就是说虽然编译链接用不上.h头文件,但是调用者编程时可能还是要看.h文件作参考来知道函数名字、参数、返回值信息)

显式调用动态库步骤:

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

2、通过 Win32 API 函数LoadLibrary()显式的调用DLL,此函数返回 DLL 的实例句柄。
3、通过 Win32 API 函数GetProcAddress()获取要调用的DLL 的函数地 址,把结果赋给自定义函数的指针类型。
4、使用函数指针来调用 DLL 函数。

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


最后,特别说明下载使用C#显式调用dll时会更加简单,如下:

[DLLImport(“DLL文件”)]

修饰符 extern 返回变量类型 方法名称 (参数列表)

描述如下:

DLL文件:包含定义外部方法的库文件。

修饰符: 访问修饰符,除了abstract以外在声明方法时可以使用的修饰符。

返回变量类型:在DLL文件中你需调用方法的返回变量类型。

方法名称:在DLL文件中你需调用方法的名称。

参数列表:在DLL文件中你需调用方法的列表。




  • 22
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值