3D视觉工坊C++

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

2018-10-30  本文已影响13人  3D视觉工坊

本文首发于微信公众号【视觉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的过程中给予了十分中肯的建议与帮助。

上一篇下一篇

猜你喜欢

热点阅读