本博客翻译自:
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/ms235636(v=vs.90)
我们第一个要创建的库是一个动态链接库(下一篇是创建静态链接库)。使用动态链接库是一种高效的代码复用方式。相比在每一个你创建的程序中重写具有相同功能的代码而言,你可以只编写一次,然后在需要用到这些功能的应用中引用他们。
本次演示包括以下几个内容:
- 新建一个动态链接库项目
- 向动态链接库中添加一个类
- 新建一个引用该动态链接库的应用程序
- 在控制台应用中使用我们所创建的类库中的功能(方法)
预备
下面的操作假定你具有C++基础。
新建一个动态链接库(DLL)项目
1.
2.
3.
4.
如果在应用程序向导中没有DLL选项,就选择控制台应用程序,因为有些VS版本不支持在应用程序向导中创建DLL项目。你可以稍后更改这个来使你的项目编译生成DLL。
向动态链接库中添加一个类
- 为新类创建头文件
2.创建一个名为MyMathFuncs的简单类来做常用的数学操作,比如加减乘除。代码如下:
// MathFuncsDll.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}
3.注意上面代码中的方法声明中的修饰符__declspec(dllexport)
。这些修饰符使得方法被DLL导出从而可以被其他应用使用。了解更多信息,参见dllexport,dllimport。
4.创建类的源文件(CPP文件)
5.在源文件中实现MyMathFuncs类声明的功能,代码如下:
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
6.为本项目生成DLL
注意:如果你是在Command Prompt(命令提示符)下创建的工程,使用/LD编译器选项来指定输出文件为DLL。了解更多信息,参见:/MD, /MT, /LD (Use Run-Time Library)。
7.编译动态链接库
这样一来,我们便创建出了一个可以被其他程序使用的DLL。了解更多信息,参见DLL。
新建一个引用我们刚才创建的动态链接库的应用程序
1.
2.
注意:在解决方案处选择下拉列表中的添入解决方案
3.
在我们上一步新建的控制台应用程序中使用我们编写的类库中的功能
1.在你新建一个控制台应用程序之后,一个空程序便创建出来了。源文件的名字和你在创建项目时选定的名字是一致的。在本例中,源文件的名字是MyExecRefsDll.cpp。
2.要想使用我们在动态链接库中封装的数学功能,必须引用我们创建的那个动态库。
了解更多关于引用对话框的信息,参见Framework and References, Common Properties, Property Pages Dialog Box.
3.
这个对话框会显示所有你能引用的库,了解更多关于添加引用对话框的信息,参见 Add Reference Dialog Box
4.要引用动态链接库的头文件,我们必须更改包含目录路径。
5.可执行程序在运行的时候才会加载动态链接库。你必须告知系统到哪寻找MathFuncsDll.dll文件。你可以使用环境变量做这件事。
点击确定。
注意:如果你想在命令行模式下运行该可执行程序,你必须在命令提示符中运行这条命令:set PATH=%PATH%;<path of MathFuncsDll.dll file>
来手动更新PATH环境变量,<path of MathFuncsDll.dll file>
表示MathFuncsDll.dll文件的路径
6.现在你可以在新建的应用中使用MyMathFuncs类了。MyExecRefsDll.cpp文件的测试代码如下:
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
#include <iostream>
#include "MathFuncsDll.h"
using namespace std;
int main()
{
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
return 0;
}
7.为该应用程序生成解决方案。
运行我们的应用
1.在解决方案资源管理器中选中MyExecRefsDll项目,右键选择设为启动项目
2.运行应用
3.运行结果