VC++深入详解(17):动态链接库

静态库
函数和数据被编译进一个二进制文件(.LIB)。在使用静态库下,在编译连接可执行文件时,链接器从库中复制这些函数和数据,并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE)。当产品发布时,只需要发布可执行文件,不需要发布使用的静态库。
它的特点在于:
1.编译后的可执行文件包含了所需要的函数的代码,占用磁盘空间较大。(但是可以避免出现用户的电脑上没有你开发时所用的库的尴尬情形。)
2.如果多个调用相同库的进程在内存中同时运行,内存中会存放多份相同的代码。
动态库
在使用动态库的时候,往往提供两个文件:引入库(.lib)文件和DLL(.dll)文件。引入文件包含DLL导出的函数和变量的符号名,而.dll包含了该DLL的实际的函数和数据。再使用动态库的情况下,在编译连接可执行文件时,只需要连接该DLL的引入库文件,而该DLL的函数代码和数据并不复制到可执行文件中,知道可执行程序运行时,才加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。此时,在发布产品时,除了发布可执行文件外,还要发布程序将要调用的动态链接库。
使用动态库的好处在于能够节省磁盘空间和内存。如果多个应用程序需要访问同样的功能,那么可以将该功能以DLL的形式提供,这样一台机器上只需要存在一份该DLL就可以了,从而节省了磁盘空间。如果多个程序调用同一个DLL,该DLL的页面只需要存放在内存一次,所有的应用程序都可以共享它的页面了。


首先,我们新建一个空的Win32动态链接库,为其增加两个函数:

int add(int a, int b)
{
	return a + b;
}

int subtract(int a, int b)
{
	return a - b;
}

当build之后,在这个工程的Debug目录下,就会有一个对应于工程明的dll文件。这个dll目前是无法使用的,因为这两个函数都没有被“导出”。我们可以利用Visual Studio提供的命令行工具Dumpbin来查看:
D:\MyPrograms\mfc\CH_19_DLL1\Debug>dumpbin -exports CH_19_DLL1.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.




Dump of file CH_19_DLL1.dll


File Type: DLL


  Summary


        7000 .data
        1000 .idata
        2000 .rdata
        2000 .reloc
       2A000 .text


其中并没有与函数有关的信息。

为了让DLL导出一些函数,需要在每个要被导出的函数前面加上标示符:_declspec(dllexport)。
此时在查看,就可以看到:
  ordinal hint RVA      name


        1    0 0000100A ?add@@YAHHH@Z
        2    1 00001005 ?subtract@@YAHHH@Z


其中?add@@YAHHH@Z和?subtract@@YAHHH@Z的意思在我的另一篇博客:《完全总结__cdecl __fastcall, __stdcall,__thiscall》中详细的讨论过,这里只说明如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值