入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

动态链接库的创建和使用

创建时间:2016-02-14 投稿人: 浏览次数:376

一、创建新的动态链接库(DLL)项目

  1. 从“File”菜单中,选择“New”,然后选择“Project…”。
    如下图:
  2. 在“项目类型”窗格中,选择“Visual C++”下的“Win32”。
  3. 在“模板”窗格中,选择“Win32 Console Application”。
  4. 为项目选择一个名称,如 MathFuncsDll,并将其键入“Name:”字段。 为解决方案选择一个名称,如 DynamicLibrary,并将其键入“Solution Name:”字段。
    如下图:

二、向动态链接库添加类

  1. 若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。 将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。 在“模板”窗格中选择“头文件(.h)”。 为头文件选择一个名称,如 MathFuncsDll.h,并单击“添加”。 将显示一个空白文件。
  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 能够导出该方法以供其他应用程序使用(Windows与Linux所不同的地方!!!!!!!)。
  4. 在源文件中实现“MyMathFuncs”的功能。 代码应与以下内容类似:
  5. // 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,请从“项目”菜单中选择 MathFuncsDll“属性…”。 在左窗格中,选择“配置属性”下的“常规”。 在右窗格中,将“配置类型”更改为“动态库(.dll)”。 单击“确定”保存更改。
  7. 编译该动态链接库,方法是选择“生成”菜单中的“生成解决方案”。 这样就创建了一个可供其他程序使用的 DLL。 如图:
    生成的dll文件的地址:

三、创建引用动态链接库的应用程序

  1. 若要创建将引用并使用刚创建的动态链接库的应用程序,请从“File”菜单中选择“New”,然后选择“Project…”。
  2. 在“项目类型”窗格中,选择“Visual C++”下的“Win32”。
  3. 在“模板”窗格中,选择“Win32 Console Application”。
  4. 为项目选择一个名称(如 MyExecRefsDll),并将其键入“名称”字段。 从“解决方案”旁边的下拉列表中选择“Add to Solution”。 这会将新项目添加到该动态链接库所属的同一个解决方案中。
    如图:

四、在控制台应用程序中使用类库的功能

  1. 步骤: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)切记第三条,让我排查了一上午,当然最好把所有输出目录定位到一个文件下面。

  2. 现在,可以在应用程序中使用“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;
    }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像