1._declspec(dllexport)表示导出库。即当前的对象(函数、类等)要生成导出库即 .lib文件。注:应用程序如果想要访问某个DLL中的函数,那么该函数必须是已经被导出的函数。注:要查看在DLL中有那些导出对象,在命令行模式下使用:dumpbin –exports x..dll。
注:如果DLL中没有任何函数被指定为导出,则指DLL不会生成相应的引入库(.lib文件)。
2._declspec(dllimport)表示导入库。即当前的对象(函数、类等)是从外部导入的。.lib文件为此外部库的声明;.dll文件中为此外部库的实现。
3.在程序中使用到了动态链接库时,需要在使用前声名此对象是外部导入,声明方式有二种:采用extern和_declspec(dllimport)。注:在调用方声明外部函数时也可以不指定_declspec(dllimport)标识、或者extern标识,指定指标识可以让编译器生成运行效率更高的代码。
4.链接器依据在设定的的链接库名(方法一:在项目的设置参数的方式设定;方法二:通过调用#pragma comment(lib,”x.lib”)的预处理指令完成)来链接lib文件,链接实现(定义)是否存在(其实并不是实现,因为在.lib库中并没有对象的实现,只有对象的符号信息。但链接器可以依据此文件提供的必要信息,在可执行文件中建立(动态链接时需要到的)重定位表)。如果在所有的链接库中都未找到导入库的声明,则链接器会报错。
5.可执行程序中动态链接库的重定位表的理解:包含引用到的动态链接库名表(可执行程序的进程空间初始化时依据此表查找DLL);每个引用到的DLL的函数等对象的地址表(依据此表将只在内存中存在一份的动态链接库的地址映射到进程空间,其实类似函数指针)。
6.程序执行时,会分配4GB的进程空间,加载程序代码,和变量;分析程序的依赖库,然后从本地主机上搜索这些链接库,如果在查找地址中没有找到,则程序运行会报异常;找到相应链接库,则为它们分配虚拟的内存空间,并将DLL的页面映射到进行程的地址空间;进程空间初始化成功。
7..lib文件的作用:其中只包含函数,类等对象的声明。链接器依据此生成可执行程序的动态链接库重定位表。
8.多程序调用同一个DLL时,此DLL的页面在内存中只加载一次。在各程序的进程空间中都维护了一份此DLL页面的映射。
9.程序发布时.lib文件可以不发行(只发布可执行程序和动态链接库即可),其只在编程时有用。作用见第7点。