时间久了的东西老是喜欢忘记,然后又要到网上去查找,网上一写就是一堆,还是要自己记录下才行,今天把动态链接库简单说明下。
首先,库分为静态库和动态库。
1.静态链接时会把里面的函数加载到exe文件中,等程序发布时就不需要DLL文件了。程序生成一个.lib文件。
2.而动态链接称为运行时调用,就是到用的时候才把函数载入进来,而且是在内存中共享的,不会把DLL中的代码链接时加入到程序里,所以程序发布时还要带载入过的DLL文件,但这样是有好处的,易于扩展,便于二次开发。程序生成一个.lib文件和一个.dll文件。
总结:我们发现,无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢?其实,两个是完全不一样的东西。静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库。实际上静态库本身就包含了实际执行代码、符号表等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,以确保程序找到对应函数的一些基本地址信息。在动态库里,实际开发中,用的很多第三方扩展库,别人一般都提供的:.h文件(类,函数的声明),.dll 文件(类或函数的实现),.lib 文件(导入库),也可以不提供lib文件,这样的话就需要一个函数指针。
然后,动态链接库加载的方式分为显式链接和隐式链接。
1.隐式调用比较简单,但需要有导入库,也就是.lib文件,然后加入一句pragma comment(lib,"xxx.lib")。 或者在VC中的set选项中,直接加入你的XXX.lib,注意,dll文件需要在当前工程目录中,不然编译好像没错,运行就会出错。
某些时候比隐式链接具有更大的灵活性,比如,如果在运行时发现DLL无法找到,程序可以显示一个错误信息并能继续运行,当你想为你的程序提供插件服务时,显式链接也很有用处。
HMOUDLU hinst = LoadLibrary("XXX.dll");
typedef int (*ADDPROC)(int,int);
ADDPROC add = (ADDPROC)GetProcAddress(hinst,"add");
printf("%d",add(2,3));
FreeLibrary(hinst);
这二个就是加载方式的区别。
好了,其它也没有什么,放个最简单的例子在这吧,结合着看一下,动态连接库其实你们就懂了,没有什么其它的东西,超级简单,HOHO。
extern "C" declspec(dllexport) int add(int a,int b)
{
return a+b;
}
看了上面的理论,来个超简单的简结步骤:
1. 静态库包括.lib和.h文件,在工程中使用静态库分为3步:
(1)包含lib文件,pragma comment();
(2)在工程中包括.h文件;
(3)工程中使用静态库中的函数;
2.动态链接库一般包括.lib(导出函数),.h,.dll文件,使用动态库有两种情况:
(1)隐式链接,同使用静态库相似,分为三步:引用.lib,包含头文件,使用导出函数;
(2)动态加载,直接使用LoadLibrary 加载所需的动态库,然后指定所需的导出函数,效率最高!
转载于:https://blog.51cto.com/thgenius/1270837