VS C++ 工程中隐藏Cpp文件

3 篇文章 0 订阅
本文介绍了两种在将C++代码交付给甲方前隐藏关键技术的方法。一种是通过链接Obj文件,保留关键cpp的编译结果而不包含源代码;另一种是使用动态库导出类,创建DLL来隐藏类实现,但因全局变量问题可能较为复杂。文章详细讲解了这两种方法的步骤和注意事项。
摘要由CSDN通过智能技术生成

按照项目的要求,在把代码工程给甲方爸爸之前,需要隐藏一些关键技术,把cpp给隐藏。

方法一:链接Obj文件

学编程的都知道,生成工程前需要先编译再链接,所以首先我们编译一遍工程,然后在项目工程的debug目录找到需要链接的obj文件,这里我们用以下文件作为实列

然后我们复制一份工程作为给甲方的代码,在复制的工程下把上面相应的cpp从工程中移除,选中MenDB.cpp文件,右键选中移除,若是能删除选删除,否则还要在工程目录中找到并删除。
在这里插入图片描述
删除上述文件后,在项目->属性->链接器->输入->附加依赖项,添加需要隐藏的cpp生成的obj链接文件,
在这里插入图片描述
若是你的obj文件不在工程目录里面,需要在项目->属性->链接器->常规->附加库目录下添加包含的目录,因为有三个文件在AllProcessDefinition这个文件下,所以需要包含文件目录
在这里插入图片描述
然后rebuild(重新生成)工程,会看到链接obj文件过程,并生成可执行程序exe,成功隐藏cpp文件。
在这里插入图片描述

方法二:使用动态库导出类

本来想用这种方法结合工厂类来隐藏,但是工程中的基类实现中包含一些其他文件的全局变量,若是做成动态库肯定还需要链接这些全局变量,很是麻烦。但是自己还是学一学这种方法以作积累。
若是你以前编写过函数的dll,那编写C++导出类的dll就比较简单,只需要在导出类名前关键字class后加上_declspec(dllexport),就可以实现导出类。
这里使用VC++编写一个C++导出类的dll,虚基类ICalculate,派生三角Triangle 和圆Circular类

«interface» ICalculate virtual GetArea virtual GetPerimeter Triangle double bottom double height Circular double radius 三角
2.1编写导出类dll

新建空项目calculater,添加类ICalculate
.h文件

#pragma once
struct _declspec(dllexport) ICalculate
{
public:
	//interface
	virtual double GetArea() = 0;
	virtual double GetPerimeter() = 0;
};

//正三角形
class _declspec(dllexport) Triangle : public ICalculate
{
public:
	Triangle(double,double);
	~Triangle()=default;
private:
	double bottom;
	double height;
public:
	double GetArea();
	double GetPerimeter();
};

//圆
class _declspec(dllexport) Circular: public ICalculate
{
public:
	Circular(double);
	~Circular()=default;

private:
	double radius;
public:
	double GetArea();
	double GetPerimeter();
};

.cpp文件

#include "Calculate.h"
Triangle::Triangle(double bottom, double height)
{
	this->bottom = bottom;
	this->height = height;
}

double Triangle::GetArea()
{
	return bottom * height / 2;
}

double Triangle::GetPerimeter()
{
	return 3 * bottom;
}

Circular::Circular(double radius)
{
	this->radius = radius;
}

double Circular::GetArea()
{
	return 3.14*radius*radius;
}

double Circular::GetPerimeter()
{
	return 2 * 3.14*radius;
}

在项目属性下,配置一下属性,选择动态库类型
在这里插入图片描述
编译生成项目,生成calculater.lib和calculater.dll文件,结果如下图所示:
在这里插入图片描述

2.2使用导出类

新建空项目calculatedlltest,新增cpp文件mainTest.cpp,添加类的头文件Calculate.h。
在这里插入图片描述
把生成的calculater.lib和calculater.dll文件复制到当前工程目录下。
在项目->属性->链接器->输入->附加依赖项,添加calculater.lib文件,注意需要”;“。
在这里插入图片描述
然后编写测试代码,mainTest.cpp的代码如下:

#include "Calculate.h"
#include <iostream>
using namespace std;
int main()
{
	ICalculate* obj = new Triangle(10, 4);
	ICalculate* obj2 = new Circular(10);
	cout << obj->GetArea() << endl;
	cout << obj->GetPerimeter() << endl;
	cout << obj2->GetArea() << endl;
	cout << obj2->GetPerimeter() << endl;
	system("pause");
	return 1;
}

运行结果如下图所示:
在这里插入图片描述
本人自身实验,若有错误,还请指出。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值