文章目录
- 动态链接库
- 1. 动态链接库的定义
- 2. 动态库的由来:
- 3. Dll与ExE程序区别
- 4. DLL导出
- 5. DLL导入
- 6. 静态库
动态链接库
1. 动态链接库的定义
- 动态链接库英文DLL,是Dynamic Link Libarary的缩写。
- Dll中包含若干公用的代码、数据等,可供其他模块(DLL或exe文件等)使用。
- Dll中并不是所有的函数都必须供其他模块使用,只有经过导出(export) 后才允许被外部正常调用。
2. 动态库的由来:
Dll最初用于节约应用程序所需要的磁盘空间和内存空间。早前在传统的非共享库中,一部分代码简单的附加到调用的程序中。如果两个程序同时调用同一个子程序,就会出现两份代码。
WindowsAPI就存在于动态链接库中。对于多个进程共同使用的Dll文件来说,在物理内存中只有一份文件,不过是被分别映射到了不同的进程内存空间,从而极大的降低了内存的消耗。
3. Dll与ExE程序区别
入口函数:DllMain函数是DLL模块的默认入口点。当windows加载DLL模块时调用这一函数。
如果没有DLLMain函数程序也能正常运行 此函数是可选函数。
对于dll项目,编译器通常会产生两个文件,分别是.DLL .lib。其中dll是动态链接库,保存了所有的代码和数据,lib是导入库,保存了一些符号和地址的对应信息。不能单独使用,必须与dll共存,用于动态链接库的隐式链接。
4. DLL导出
作为一个DLL文件,它的最大作用就是提供函数给其他的模块使用,提供的函数叫导出函数。
导出方式:1、声明导出 2、模块定义文件导出。
除了导出函数外,dll文件还可以导出变量,c++类。
导出方式:
-
声明导出
extern “C” _declspec(dllexport) function
-
模块定义文件导出
- 定义文件export.def
- 编写代码
LIBRARY "mydll" EXPORTS my_min @ 1
- 项目属性 -> 链接器 -> 输入,将模块定义文件设置为“export.def”
5. DLL导入
-
通过隐式链接的方式调dll导出的函数。
#pragma comment(lib,“xx.lib”)
-
通过显式链接方式调用导出函数。
- LoadLibrary();API函数。
//加载dll
HMODULE hModule = LoadLibraryW(L"mydll.dll");
//获取相应函数
GetProcAddress(hModule,“”);
FreeLibrary();
6. 静态库
静态库又叫对象库,其中的代码在运行连接器进行静态链接时被添加到程序的.exe文件中,静态链接库最终会与调用程序融为一体,其文件后缀也是.lib
静态链接库只能使用隐式链接。静态链接库在程序编译前,在链接过程会被直接添加到目标应用程序中,会加大应用程序的体积。