加载动态库的两种⽅式(win)
Windows环境下动态库的加载有两种⽅式,记录如下。
环境:vs海昌加勒比
1.加载动态库的两种⽅式
隐式加载
符号名字
显式加载
2.隐式加载
隐式加载在程序开始执⾏时将dll⽂件加载到内存中。这种加载⽅式需要:.h⽂件,.dll⽂件,.lib⽂件。
在vs的项⽬属性->链接器的附加库⽬录设置为存放.lib⽂件的路径,附加依赖项加⼊⽤到的.lib⽂件名字。将.dll⽂件和项⽬⽣成的.exe⽂件放在⼀起就可以使⽤.dll⽂件中的函数了。
如果.lib⽂件没有放⼊搜索路径,可在程序中使⽤#pragma comment(lib,libpath)显⽰链接。薛之谦其实
3.显式加载
显式加载是实时加载,程序需要时加载,不需要时卸载。这种加载⽅式需要:.h⽂件,.dll⽂件。
这种加载⽅式的⽰例参考。
发言材料下⾯说⼀下⽰例程序的.h⽂件:
(1)extern "C"
链接器⽣成的DLL⽂件中会嵌⼊⼀个导出符号表,这个导出段列出了导出的变量、函数和类的符号名。
C语⾔不⽀持重载,由C编译器编译的动态库导出的函数的符号名就是源代码中函数的名字。C++语⾔⽀持重载,由C++编译器编译的动态库导出的函数的符号名不是源代码中函数的名字,C++编译器会对源代码中函数的名字做⼀个修改,以确保导出的函数的符号名的全局唯⼀性。
使⽤extern "C"就是要告诉编译器不要对函数名就⾏修改,以C语⾔的⽅式导出函数的符号名。由C++编译器⽣成的函数的符号名需要使⽤⼯具才能查看,这样就不⽅便对库函数的调⽤,使⽤extern "C"来指定编译器⽣成C风格的函数符号,⽅便对库函数的调⽤。
(2)__declspec(dllexport)
编译器看到⼀个变量、函数或者C++类被它修饰,那么它就知道应该在⽣成的DLL 模块中导出该变量、函数或C++类。
(3)__declspec(dllimport)
编译器看到⼀个变量、函数或者C++类被它修饰,那么它就知道可执⾏⽂件或DLL的源⽂件需要从其它DLL模块中导⼊⼀些变量和函数。
注:
咏鸡
(1)dumpbin(vs⾃带):查看DLL库中函数的符号名。
(2)在⼀些对外提供接⼝的项⽬中,业务逻辑可以使⽤C++⾯向对象思想去完成,对外提供接⼝的⽅式可以按照⽰例程序中的⽅式对外提供。赞美荷花的诗句