C++ 中动态链接库--导入和导出的实例详解
动态链接库
动态链接库(Dynamic Link Library,简称 DLL)是一种共享库,可以在多个不同的应用程序中被使用,从而达到代码共享与节约程序的空间资源的目的。在C/C++ 中,链接器需要将每一个源文件的目标文件抽出来并重新组合成一个大的目标文件,该目标文件包含了完整代码,因此容易造成代码浪费和可执行程序文件过于庞大的问题。而使用动态链接库则可以很好地解决这些问题。
动态链接库的优点
- 程序模块化,容易维护,代码相互独立,便于分工协作开发。
- 能够共享代码,使程序更加轻巧,节省了硬盘空间和内存资源。
- 便于程序升级,只需将 DLL 文件替换即可,不影响主程序。
- 提高应用程序的运行速度,因为程序优先调用 DLL 文件中已编译好的函数代码,而不是自己编写的代码。
动态链接库的导入和导出
对于 DLL 文件,它有两种角色:导入库和导出库。导入库(.lib文件)是给应用程序使用的而导出库(.dll文件)是给程序员写 DLL 的时候使用的。导入库可以理解为使用 DLL 的“中介”,它负责维护和调用 DLL 函数的地址等信息,而导出库则负责将 DLL 中的函数暴露出来让外部使用。
导出例子
首先,我们需要定义一个导出函数,在 C++ 中则采用 extern "C" 关键字来指定导出函数的 C++ 风格(即取消了函数名的名称修饰),代码示例如下:
#ifdef EXPORTS
#define EXPORT_API extern "C" __declspec(dllexport)
#else
#define EXPORT_API extern "C" __declspec(dllimport)
#endif
EXPORT_API int add(int a, int b)
{
return a + b;
}
该代码指定了导出函数 add,并且在 DLL 中使用 __declspec(dllexport) 来使其暴露。同时用 __declspec(dllimport) 来引用导出函数。
导入例子
然后我们需要编写一个测试程序来使用导出函数,代码示例如下:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
HINSTANCE hDll = LoadLibrary(TEXT("MyMathDLL.dll"));
if (hDll)
{
FARPROC pAdd = GetProcAddress(hDll, "add"); //获取导出函数
if (pAdd)
{
int a = 3;
int b = 5;
int c = ((int (__cdecl *)(int, int))pAdd)(a,b); //调用导出函数
cout<<"a + b = "<<c<<endl;
}
else
cout<<"Function add not found"<<endl;
FreeLibrary(hDll);
}
else
cout<<"Load DLL failed"<<endl;
return 0;
}
该代码使用 LoadLibrary 函数加载 DLL,并使用 GetProcAddress 函数获取 DLL 中指定的导出函数 add。在获取到导出函数之后,通过强制转换成指针的方式来使用导出函数。最后,在使用完导出函数后,使用 FreeLibrary 函数将 DLL 卸载,释放内存空间。
以上就是使用 C++ 实现 DLL 中导入和导出的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中动态链接库–导入和导出的实例详解 - Python技术站