梳理下项目中常用的动态库、静态库使用方式。
静态库
静态库工程生成一个静态库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_#include namespace 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的区别及使用方法