VS如何将核心函数封装成dll、lib,并供给第三方调用?

2020-12-11 16:07:48 浏览数 (1)

前言

我们在编写项目过程中,有时难免需要将项目核心源码进行加密,那么如何利用VS实现呢?最佳的策略便是将核心代码编译成动态库dll了。

今天呢,简单地以一个小例子,来介绍一下我自己是如何生成dll的,如有不到位的地方,还请大家留言指正,不甚感激。

此处我们以一个问题来展开行文:

A客户需要小明实现这样一个功能:利用QT实现两个整数加法求和的操作,不需要加法求和的具体实现,也就是不需要源码,只需要能给他dll,他们直接调用它进行加法操作即可。

接到任务后,小明很快便成了A客户要求的任务。那么他具体是如何实施的呢?

一 先封装核心函数,实现功能

  先新建一个QT demo,添加控件如下:

其中求和函数属于核心函数,是通过自己的聪明才智编写实现的,头文件以及实现函数如下: VisionIMAX.h:

代码语言:javascript复制
#pragma once#include "iostream"#include"sstream"using namespace std;class VisionIMAX{public:///求和计算
 static int addInt(int &firstNum,int &secondNum);
};

VisionIMAX.cpp:

代码语言:javascript复制
#include "VisionIMAX.h"///求和计算int VisionIMAX::addInt(int &firstNum, int &secondNum)
{    int total = firstNum   secondNum;    return total;
}

  为了将求和函数在给他人调用时,避免让对方窥见源码,此处我们将其编译成dll,提供给用户,具体操作如下。

二 将核心函数生成dll、lib(此处以debug模式下为例,release模式下相类似)

  在原解决方案中,添加一个新项目,命名为VisionIMAX。

在项目工程VisionIMAX中添加VisionIMAX.h和VisionIMAX.cpp,实现求和函数。

VisionIMAX.h文件如下:

代码语言:javascript复制
#include "iostream"#include"sstream"using namespace std;///VISIONIMAX为类名的大写#ifdef VISIONIMAX_EXPORTS#define VISIONIMAX_API __declspec(dllexport)#elif defined (VISIONIMAX_API_IMPORT_DLL)#define VISIONIMAX_API __declspec(dllimport)#else#define VISIONIMAX_API#endifclass VISIONIMAX_API VisionIMAX{public:    ///求和计算
   static int addInt(int &firstNum, int &secondNum);
};

VisionIMAX.cpp文件如下:

代码语言:javascript复制
#include "VisionIMAX.h"///求和计算int VisionIMAX::addInt(int &firstNum, int &secondNum)
{    int total = firstNum   secondNum;    return total;
}

之后,我们便可以生成dll和lib了,操作如下图所示:

对应生成的dll和lib所在位置如下图中所示:

到对应目录下,即可看到编译生成的dll和lib文件。

三 调用dll、lib文件

对应上述生成的dll和lib,我们如何在工程中调用呢? 首先,将原解决方案中的VisionIMAX.h和VisionIMAX.cpp文件移除,接下来步骤如下 1)在原项目中新建两个文件夹「include」和「lib」,其中「include」中存放上述第二步中编写的「VisionIMAX.h」文件,「lib」中存放上述第二步中生成的dll和lib文件。

2)将include中的VisionIMAX.h头文件添加到addGUI项目工程中;

3)在将编译好的dll和lib的目录添加进工程中。

稍加注意的是,由于我们新建了一个文件夹「include」,因而在调用VisionIMAX.h头文件的地方,需要改为:#include "./include/VisionIMAX.h"

经过测试,原程序调用dll和lib,可以正确进行加法计算,如图所示:

由此说明,上述方法正确。

四 跋

    最后要感谢同事陈刘明,在摸索如何生成dll和lib的过程中给予了十分中肯的建议与帮助。

0 人点赞