1. 什么是动态链接库
动态链接库是一个函数和变量的集合,在调用它的程序运行时才被加载。因此,动态链接库和可执行程序是分离的。
使用动态链接库具有以下优点:(1)隐藏源代码;(2)实现代码重用;(3)当程序调用DLL中的函数时不需要重新编译,提高编译速度;(4)当多个程序调用同一DLL中函数时,内存中只有一个副本,节省内存空间;(4)可通过替换DLL来实现程序的维护和升级。
当在应用程序中加载DLL时,有两种方法来调用导出的DLL函数,它们分别为加载时动态链接和运行时动态链接。
在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h)和导入库文件(.lib)。当您这样做时,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置。
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,无需使用导入库文件。
2.
2.1
2.2 Application type设置为Dll,勾选Empty project,单击Finish按钮。
2.3 新建myDllTest.h文件,内容如下:
#ifndef MY_DLL_TEST_H
#define MY_DLL_TEST_H
#ifdef EXPORTING_DLL
#define API_TYPE __declspec(dllexport)
#else
#define API_TYPE __declspec(dllimport)
#endif
API_TYPE double my_add(double x, double y);
API_TYPE double my_subtract(double x, double y);
API_TYPE double my_times(double x, double y);
#endif
2.4 新建myDllTest.h文件,内容如下:
#include "myDllTest.h"
#define EXPORTING_DLL
double my_add(double x, double y)
{
}
double my_subtract(double x, double y)
{
}
double my_times(double x, double y)
{
}
2.5 分别在Debug和Release模式下编译,这时在文件夹myDllTest\Debug和myDllTest\Release内都有myDllTest.dll和myDllTest.lib文件,将myDllTest\Debug里面的myDllTest.lib重新命名为myDllTestd.lib。只需保留myDllTest\Release中的dll文件。
2.6 myDllTest.dll,myDllTestd.lib,myDllTest.lib和myLibTest.h是我们最终交付给用户的文件。
3. 使用加载时动态链接方式调用动态链接库
3.1
3.2
3.3
#include <myDllTest.h>
using namespace std;
#ifdef _DEBUG
#pragma comment(lib, "myDllTestd.lib")
#else
#pragma comment(lib, "myDllTest.lib")
#endif
int main(int argc,char **argv)
{
}
也可以在Project -> Properties中添加相应的Additional Dependences,如下所示。Debug模式下添加Debug模式下编译的LIB文件,Release模式下添加Release模式下编译的LIB文件。
3.4 按下快捷键Ctrl+5,编译程序,输出以下结果。
注1:生成应用程序后,把所需要的DLL文件复制到程序所在目录下。否则会出现以下错误。