本文首发于微信公众号【视觉IMAX】,作者原创。
前言
我们在编写项目过程中,有时难免需要将项目核心源码进行加密,那么如何利用VS实现呢?最佳的策略便是将核心代码编译成动态库dll了。
今天呢,简单地以一个小例子,来介绍一下我自己是如何生成dll的,如有不到位的地方,还请大家留言指正,不甚感激。
此处我们以一个问题来展开行文:
A客户需要小明实现这样一个功能:利用QT实现两个整数加法求和的操作,不需要加法求和的具体实现,也就是不需要源码,只需要能给他dll,他们直接调用它进行加法操作即可。
接到任务后,小明很快便成了A客户要求的任务。那么他具体是如何实施的呢?
一 先封装核心函数,实现功能
先新建一个QT demo,添加控件如下:
其中求和函数属于核心函数,是通过自己的聪明才智编写实现的,头文件以及实现函数如下:
VisionIMAX.h:
#pragma once
#include "iostream"
#include"sstream"
using namespace std;
class VisionIMAX
{
public:
///求和计算
static int addInt(int &firstNum,int &secondNum);
};
VisionIMAX.cpp:
#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文件如下:
#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
#endif
class VISIONIMAX_API VisionIMAX
{
public:
///求和计算
static int addInt(int &firstNum, int &secondNum);
};
VisionIMAX.cpp文件如下:
#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的过程中给予了十分中肯的建议与帮助。
网友评论