动态链接库的创建和使用
一、创建新的动态链接库(DLL)项目
-
从“File”菜单中,选择“New”,然后选择“Project…”。
如下图: - 在“项目类型”窗格中,选择“Visual C++”下的“Win32”。
- 在“模板”窗格中,选择“Win32 Console Application”。
-
为项目选择一个名称,如 MathFuncsDll,并将其键入“Name:”字段。 为解决方案选择一个名称,如 DynamicLibrary,并将其键入“Solution Name:”字段。
如下图: -
二、向动态链接库添加类
- 若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。 将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。 在“模板”窗格中选择“头文件(.h)”。 为头文件选择一个名称,如 MathFuncsDll.h,并单击“添加”。 将显示一个空白文件。
-
添加一个名为“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); }; }
- 请注意此代码方法声明中的 __declspec(dllexport) 修饰符。 这些修饰符使 DLL 能够导出该方法以供其他应用程序使用(Windows与Linux所不同的地方!!!!!!!)。
- 在源文件中实现“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; } }
- 若要将项目生成为 DLL,请从“项目”菜单中选择 MathFuncsDll“属性…”。 在左窗格中,选择“配置属性”下的“常规”。 在右窗格中,将“配置类型”更改为“动态库(.dll)”。 单击“确定”保存更改。
-
编译该动态链接库,方法是选择“生成”菜单中的“生成解决方案”。 这样就创建了一个可供其他程序使用的 DLL。 如图:
生成的dll文件的地址:
三、创建引用动态链接库的应用程序
- 若要创建将引用并使用刚创建的动态链接库的应用程序,请从“File”菜单中选择“New”,然后选择“Project…”。
- 在“项目类型”窗格中,选择“Visual C++”下的“Win32”。
- 在“模板”窗格中,选择“Win32 Console Application”。
-
为项目选择一个名称(如 MyExecRefsDll),并将其键入“名称”字段。 从“解决方案”旁边的下拉列表中选择“Add to Solution”。 这会将新项目添加到该动态链接库所属的同一个解决方案中。
如图: -
四、在控制台应用程序中使用类库的功能
-
步骤:1.Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径
(这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程.)
(若不设置,编译报错:无法打开***文件,或者在调用处#include<...dll头文件相对路径...>)
2.Project->properties->c/c++->general->additional include directories 添加包含文件
(若采用在调用处#include<...dll头文件相对路径...>的方法则不用设置)
Project->properties->linker->general->additional library directories 添加库文件
Project->properties->linker->input->additional additional dependencies添加用到的lib
(编译生成.dll的同时必然也有一个.lib;这一步也可以在代码中显示调用 #pragma comment(lib, "***.lib") )
(若不添加,连接报错:无法解析的外部符号)
3.将dll文件拷贝到工程debug文件下(如果不拷贝,编译链接不报错,运行报错:无法找到***.dll)切记第三条,让我排查了一上午,当然最好把所有输出目录定位到一个文件下面。
-
现在,可以在应用程序中使用“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; }
- 上一篇:没有了
- 下一篇:没有了