在编程中,一个关键的问题就是 代码或模块复用,对于 模块复用 来说,LIB 和 DLL是最好的复用方式。
先来说静态库LIB,LIB库有两种可能:
1. 在 Windows下是静态库(对应Linux下的 .a 文件);
2. 对应 DLL 的入口或说明文件;
再来说 DLL,动态链接库(dynamic link library),是程序运行时用到的。
一个标准程序的生成过程:
a)通过头文件 .h来进行编译调用;
b)通过 .lib 来进行链接(Link);
c)想要使动态链接的程序运行起来,需要加载 DLL。
C++提供两种 DLL 链接方式,隐式链接 和 显式链接。
一. 隐式链接
所谓隐式链接是指 并不指定 DLL 的存在,而是通过 头文件和 LIB 库来进行编译,隐式的索引到 对应的 DLL符号。
来看一个例子:
#include "Test.h"
#pragma comment(lib, "Test.lib") // 链接
int main()
{
int result = Test_Add(1,2); // DLL中的函数,在.h中声明
return(0);
}
二. 显式链接
直接通过函数指针和WIN32 API函数LoadLibrary、GetProcAddress进行装载,不需要.lib文件和.h头文件,只需要.dll文件即可。 显式调用提供了一种简洁的方法,或者是在头文件和lib文件丢失情况下的一种解决方案。
#include "windows.h"
typedef void (*TEST_FUNC_ADD)(int,int);
int main()
{
DLLFunc Test_Add;
HINSTANCE hInstLibrary = LoadLibrary("Test.dll"); // 动态加载DLL
if(!hInstLibrary)
{
Test_Add = (DLLFunc)GetProcAddress(hInstLibrary, "Test_Add");
int result = Test_Add(1,2);
FreeLibrary(hInstLibrary);
}
return(0);
}