创建和使用动态库(C++)读书笔记

文章目录


使用库是重复使用代码的一种方式,不用在创建的每个程序中重新实现相同的例程,一次性编写,然后从需要该功能的应用中引用它们。通过将代码置于DLL,可以节省引用它的每个应用中的空间,也可以更新该DLL而无需重新编译所有应用。

  • 创建动态链接库(DLL)项目

  • 向动态链接库添加类

  • 创建应用DLL的应用

  • 在该应用中使用类库中的功能

  • UML序列图和流程图

  • 运行应用程序


#创建动态链接库(DLL)项目
这里写图片描述

#向动态链接库添加类
##添加MathFuncsDll.h

// MathFuncsDll.h

#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif

namespace MathFuncs
{
    // This class is exported from the MathFuncsDll.dll
    class MyMathFuncs
    {
    public:
        // Returns a + b
        static MATHFUNCSDLL_API double Add(double a, double b);

        // Returns a - b
        static MATHFUNCSDLL_API double Subtract(double a, double b);

        // Returns a * b
        static MATHFUNCSDLL_API double Multiply(double a, double b);

        // Returns a / b
        // Throws const std::invalid_argument& if b is 0
        static MATHFUNCSDLL_API double Divide(double a, double b);
    };
}

在此代码中,当MATHFUNCSDLL_EXPORTS符号已经被定义时,成员函数声明部分的MATHFUNCSDLL_API符号将被设置为_declspec(dllexport)修饰符。词修饰符使函数能作为DLL导出,以供其他应用程序调用。如果未定义MATHFUNCSDLL_EXPORTS(例如,应用程序包含了头文件),则MATHFUNCSDLL_API将定义成员函数声明中的_declspec(dllimport)修饰符。此修饰符将优化在应用程序中导入该函数的操作。默认情况下,DLL的新建项目模板会将PROJECTNAME_EXPORTS添加到DLL项目的已定义符号中。在例子中,生成MathFuncsDll项目后将定义MATHFUNCSDLL_EXPORTS。

##添加MathFuncsDll.cpp源文件

// MathFuncsDll.cpp : Defines the exported functions for the DLL application. 
//

#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 invalid_argument("b cannot be zero!");
        }

        return a / b;
    }
}

#创建应用DLL的应用

创建win32应用程序,并添加源码

// 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;

    try {
        cout << "a / 0 = " <<
            MathFuncs::MyMathFuncs::Divide(a, 0) << endl;
    }
    catch (const invalid_argument &e) {
        cout << "Caught exception: " << e.what() << endl;
    }
    system("pause");
    return 0;
}

#在该应用中使用类库中的功能
##添加引用
这里写图片描述

##包含头文件
这里写图片描述

#运行应用程序
这里写图片描述

#参考目录
演练:创建和使用动态链接库(C++)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值