梳理下项目中常用的动态库、静态库使用方式。
静态库静态库工程生成一个静态库lib文件。
参考文献6制作lib后,有三种方式去使用:
- 使用comment 显式调用,这样不用在visual studio 链接器->输入->附件依赖库里面配置依赖库,由于没有指定依赖库路径所有需要显示填写路径。使用comment 显式调用,同时需要在链接器->常规->附加库目录中配置依赖库路径。由于使用了comment所以不用在visual studio 链接器->输入->附件依赖库里面配置。隐式调用,需要在链接器->常规->附加库目录中配置依赖库路径,同时在链接器->常规->附加库目录中配置依赖库路径。
#include动态库#include "Mylib.h" // 工程配置里面设置头文件包含路径 //#pragma comment(lib,"../Debug/staticlib.lib") // 指定路径,当前路径为vcxproj文件所在路径 //#pragma comment(lib,"staticlib.lib") //工程配置里面可以配置,就可以不填写路径了;(链接器附加库目录中配置) // 可以在visual studio里面配置 using namespace std; int main(int argc, char **argv) { STATIC_LIB::PrintHello(); system("pause"); return 0; }
动态库工程生成一个引入库lib文件和dll文件。对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。动态库的引入库文件和静态库文件有着本质的区别。
代码里面设置导出符号:
//MyLib.h #pragma once #ifndef _STATIC_LIB_H_ #define _STATIC_LIB_H_ #includenamespace STATIC_LIB { extern "C" __declspec(dllexport) void __cdecl PrintHello(); } #endif // MyLib.cpp #include "MyLib.h" extern "C" __declspec(dllexport) void __cdecl STATIC_LIB::PrintHello() { std::cout << "Hello world!" << std::endl; }
动态库使用方式有两种:一种是“隐式调用”,另外一种是“显示调用”。
隐式调用:需要引入库.lib文件,同时在visual studio里面配置。需要在链接器->常规->附加库目录中配置依赖库路径,同时在链接器->常规->附加库目录中配置依赖库路径。
#include显示调用:#include "Mylib.h" // 需要include头文件 using namespace std; int main(int argc, char **argv) { STATIC_LIB::PrintHello(); system("pause"); return 0; }
不需要使用引入库.lib文件,也不需要include头文件,直接使用函数加载库:
#include参考文献://#include "Mylib.h" // 不用include头文件; #include using namespace std; typedef void(*func)(void); int main(int argc, char **argv) { HMODULE hDll = LoadLibrary("staticlib.dll"); if (hDll != NULL) { func f = (func)GetProcAddress(hDll, "PrintHello"); // 名字要一致,否则返回空指针; if (f != NULL) { f(); } } FreeLibrary(hDll); system("pause"); return 0; }
- dll 导出函数名的那些事windows 动态库的封装以及调用如何制作windows下的dll(动态链接库)以及如何使用DLL文件Dll制作与使用教程DLL编写教程手把手教你如何制作和使用lib和dllwindows中静态库lib和动态dll的区别及使用方法



