【C++学习笔记】二、VS2019 DLL工程项目说明

4 篇文章 0 订阅
1 篇文章 0 订阅

一、 DLL工程建立

DLL:
先看百度词条对DLL的解释
动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
https://baike.baidu.com/item/.dll/2133451?fr=aladdin

好了,废话不多说直接看图建工程实战:

在这里插入图片描述
在这里插入图片描述
然后放到合适的位置(注:能不要有中文路径就不要有中文路径,工程的一切除注释外尽量都是英文字符,避免不必要的麻烦。)
工程建立完如下:
在这里插入图片描述
你可以直接删掉源文件和头文件的文件(不过得自己把属性页预编译头使用给取消掉)在这里插入图片描述在这里插入图片描述
这里先暂时不做属性页面的修改.暂时先跳过上图页面修改的两个步骤。

二、添加自己的代码

先在pch.h中添加以下的代码。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#define IMPORT_DLL  _declspec(dllimport)						//指的是允许将其给外部调用
#define IMPORT_DLL_C extern "C"_declspec(dllimport)

IMPORT_DLL int m_findMax(int*, int);							//查找数组中的最大值		
IMPORT_DLL int m_findMin(int*, int);							//查找数组中的最小值

IMPORT_DLL void m_Bubble_sort(int*, int);						//冒泡排序
IMPORT_DLL void m_Bubble_sort(int* a, int length, int mode);	//冒泡排序mode控制

IMPORT_DLL void m_Selection_sort(int*, int);					//选择排序
IMPORT_DLL void m_Selection_sort(int*, int, int);				//选择排序

IMPORT_DLL void m_Quick_sort(int arr[], int low, int high);	//快速排序

IMPORT_DLL int binaryfind(int*, int, int, int, int);			//二分法查找,需要升序排列后,且无法检测重复数据
													//查找数为尾部数据无法查询到
IMPORT_DLL int m_Fibonacci(int, int);							//斐波那契数列

IMPORT_DLL void m_print(int*, int);			//打印数组

#endif //PCH_H

再在相应的pch.cpp中添加以下内容

/*
创建者	:	XTT
功能	:	Sort算法

时间	:	2020/01/14
*/
// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

// 当使用预编译的头时,需要使用此源文件,编译才能成功。

#include <iostream>

using namespace std;

/*
功能: 	- 查找数组中最大值
		@int* a		:	目标数组
		@int length	:	数组长度
		@param
		@return		:	最大值
描述	:
示例	:	m_findMax(a, 5);
*/
int m_findMax(int* a, int length)
{
	int* temp = a;
	int MaxIndex = 0;
	int max = temp[0];
	for (int i = 1; i < length; i++)
	{
		if (temp[i] > max)
		{
			max = temp[i];
			MaxIndex = i;
		}
	}
	//cout << "最大值" << max << endl;
	//cout << "索引"   << MaxIndex << endl;
	//return MaxIndex;
	return max;
}

/*
功能: 	- 查找数组中最小值
		@int* a		:	目标数组
		@int length	:	数组长度
		@param
		@return		:	最小值
描述	:
示例	:	m_findMin(a, 5);
*/
int m_findMin(int* a, int length)
{
	int* temp = a;
	int MinIndex = 0;
	int min = temp[0];
	for (int i = 1; i < length; i++)
	{
		if (temp[i] < min)
		{
			min = temp[i];
			MinIndex = i;
		}
	}
	//cout << "最小值" << min << endl;
	//cout << "索引" << MinIndex << endl;
	//return MinIndex;
	return min;
}

/*
功能: 	- 冒泡排序:默认降序
		@int* a		:	目标数组
		@int length	:	数组长度
		@param
		@return		:	无
描述	:
示例	:	m_Bubble_sort(a, 5);
*/
void m_Bubble_sort(int* a, int length)
{
	int temp;
	for (int i = 0; i < length - 1; i++)
	{
		for (int j = 0; j < length - 1 - i; j++)
		{
			if (a[j] < a[j + 1])		// >:升序
										// <:降序
			{
				//交换
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

/*
功能: 	- 冒泡排序:
		@int* a		:	目标数组
		@int length	:	数组长度
		@int mode	:	0 :降序
						1 :升序
		@return		:	无
描述	:
示例	:	m_Bubble_sort(a, 5, 1);
*/
void m_Bubble_sort(int* a, int length, int mode)
{
	int temp;
	for (int i = 0; i < length - 1; i++)
	{
		for (int j = 0; j < length - 1 - i; j++)
		{
			switch (mode)
			{
			case 0:
				if (a[j] < a[j + 1])
				{
					temp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp;
				}
				break;
			case 1:
				if (a[j] > a[j + 1])
				{
					temp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp;
				}
				break;
			default:
				cout << "mode_error" << endl;
				return;
			}

		}
	}
}

/*
功能: 	- 选择排序:默认升序
		@int* a		:	目标数组
		@int length	:	数组长度
		@param
		@return		:	无
描述	:
示例	:	m_Selection_sort(a, 5);
*/
void m_Selection_sort(int* a, int length)
{
	int temp;
	int min = 0; 				//假设最小值是数组的第一个元素
	int minIndex = 0;			//最小值的初始下标为0
	for (int i = 0; i < length - 1; i++)
	{
		min = a[i];			//假设第i个元素是最小值
		minIndex = i;
		for (int j = i + 1; j < length; j++)
		{
			if (a[j] < min)
			{
				min = a[j];
				minIndex = j;
			}
		}
		//交换
		if (minIndex > i)
		{
			temp = a[minIndex];
			a[minIndex] = a[i];
			a[i] = temp;
		}
	}
}

/*
功能: 	- 选择排序:
		@int* a		:	目标数组
		@int length	:	数组长度
		@int mode	:	0:降序
						1:升序
		@return		:	无
描述	:
示例	:	m_Selection_sort(a, 5);
*/
void m_Selection_sort(int* a, int length, int mode)
{
	int temp;
	int min = 0; 				//假设最小值是数组的第一个元素
	int minIndex = 0;			//最小值的初始下标为0
	for (int i = 0; i < length - 1; i++)
	{
		min = a[i];			//假设第i个元素是最小值
		minIndex = i;
		for (int j = i + 1; j < length; j++)
		{
			switch (mode)
			{
			case 0:
				if (a[j] > min)
				{
					min = a[j];
					minIndex = j;
				}
				break;
			case 1:
				if (a[j] < min)
				{
					min = a[j];
					minIndex = j;
				}
				break;
			default:
				cout << "mode_error" << endl;
				return;
			}
		}
		//交换
		if (minIndex > i)
		{
			temp = a[minIndex];
			a[minIndex] = a[i];
			a[i] = temp;
		}
	}
}

/*
功能: 	- 二分法查找
		@unsigned int* a	: 源数组
		@int length		    : 数组长度
		@int low			: 起始位置
		@int high			: 结束位置
		@int x				: 查找数字
描述	:	binaryfind(a, 5, 0, 5, 3);
*/
int binaryfind(int* a, int length, int low, int high, int x)
{
	int* temp = a;
	int min = low;
	int max = high;
	int mid = (min + max) / 2;
	//若区间大小已经为0,则不存在查找的空间中
	if (mid == 0)
	{
		cout << "error" << endl;
		return NULL;
	}
	if (temp[mid] > x)
	{
		min = min;
		max = max - (max + min) / 2;
		if (max < 0)
		{
			cout << "error" << endl;
			return NULL;
		}
		binaryfind(temp, mid, min, max, x);
	}
	else if (temp[mid] < x)
	{
		min = min + (max + min) / 2;
		max = max;
		if (min > max)
		{
			cout << "error" << endl;
			return NULL;
		}
		binaryfind(temp, mid, min, max, x);
	}
	else if (x == temp[mid])
	{
		cout << "查找到的数值为" << x << endl;
		cout << "为数组第" << mid << endl;
	}
	return mid;
}

/*
功能: 	- 斐波那契
		@ int n		: 数列序号
		@ int mode	:	0 :递归
						1 :分治法

描述	:
*/
int m_Fibonacci(int n, int mode)
{
	if (n == 0)
		return 0;
	if (n <= 2)
		return 1;
	else
	{
		switch (mode)
		{
		case 0:
		{
			return (m_Fibonacci(n - 1, 0) + m_Fibonacci(n - 2, 0));
		}

		case 1:
		{
			int first = 0;
			int second = 1;
			while (0 < n--)
			{
				second += first;
				first = second - first;
			}
			return (first + second);
		}
		default:
		{
			cout << "" << endl;
			return NULL;
		}
		}
	}

}

void m_print(int* a, int length)
{
	for (int i = 0; i < length; i++)
	{
		cout << a[i] << "\t";
	}
	cout << endl;
}

/*
功能: 	- 快速排序
		@ int arr[]	: 目标数组
		@ int low	:
		@ int high	:

描述	:
*/
void m_Quick_sort(int* a, int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int i = left;
	int key = a[right];
	int j = right + 1;

	while (true)
	{
		while (a[++i] < key)
		{
			if (i == right)
			{
				break;
			}
		}
		while (a[--j] > key)
		{
			if (j == left)
			{
				break;
			}
		}
		if (i >= j)break;
		int temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	//交换key值
	int temp = a[left];
	a[left] = a[j];
	a[j] = temp;

	m_Quick_sort(a, left, j - 1);
	m_Quick_sort(a, j + 1, right);
}

然后选择相应的系统和版本直接运行(可以去生成解决方案,一样的道理)(x86,x64随便)
在这里插入图片描述
然后报错,忽略警告和报错。
在这里插入图片描述

三、使用DLL

在自己debug文件夹中找到对应的dll文件和lib文件(x64运行结果在x64文件夹下debug)
在这里插入图片描述
在这里插入图片描述
创建一个新的空项目在这里插入图片描述
将对应的.dll文件和.lib文件复制到新工程目录下
在这里插入图片描述
在新工程内添加一个main.cpp文件和一个头文件.
在这里插入图片描述
.lib .dll文件名可以修改,但是你需要修改如下内容

#pragma comment(lib,"Dll2.lib")

头文件内容为下:(其实就是删除掉之前的宏,并添加了运行lib的命令)(这是一种静态链接)

/*
创建者	:	XTT
功能	:	Sort算法

时间	:	2020/01/14
*/
#ifndef __M_SORT_H
#define __M_SORT_H

#pragma comment(lib,"Dll2.lib")

int m_findMax(int*, int);							//查找数组中的最大值		
int m_findMin(int*, int);							//查找数组中的最小值

void m_Bubble_sort(int*, int);						//冒泡排序
void m_Bubble_sort(int* a, int length, int mode);	//冒泡排序mode控制

void m_Selection_sort(int*, int);					//选择排序
void m_Selection_sort(int*, int, int);				//选择排序

void m_Quick_sort(int arr[], int low, int high);	//快速排序

int binaryfind(int*, int, int, int, int);			//二分法查找,需要升序排列后,且无法检测重复数据
													//查找数为尾部数据无法查询到

int m_Fibonacci(int, int);							//斐波那契数列


void m_print(int*, int);			//打印数组

#endif // !__M_SORT_H


添加运行main.cpp文件内容如下:

/*
创建者	:	XTT
功能	:

时间	:	2020/01/14
*/
#define CRTDBG_MAP_ALLOC    
#include <iostream>    
#include <crtdbg.h>  
#include <ctime>
#include <vector>
#include "m_sort.h"

using namespace std;

void test1();
void test2();
void test3();
void test4();
void test5();

int main()
{
    test1();
    test2();
    test3();
    test4();
    test5();
    cout << "time = " << (double)(clock()) / CLOCKS_PER_SEC << "s" << endl;
    _CrtDumpMemoryLeaks();
    system("pause");
    return 0;
}

void test1()
{
    int* a = new int[5];
    srand((unsigned)time(NULL));
    for (int i = 0; i < 5; i++)
    {
        a[i] = rand() % 100;
    }
    for (int i = 0; i < 5; i++)
    {
        cout << a[i] << "\t";
    }
    cout << endl;
    cout << "最大值" << m_findMax(a, 5) << endl;
    cout << "最小值" << m_findMin(a, 5) << endl;
    m_Selection_sort(a, 5, 1);
    for (int i = 0; i < 5; i++)
    {
        cout << a[i] << "\t";
    }
    delete[] a;
}

void test2()
{
    int* a = new int[5];
    srand((unsigned)time(NULL));
    for (int i = 0; i < 5; i++)
    {
        a[i] = rand() % 6;
    }
    m_print(a, 5);
    m_Selection_sort(a, 5, 1);
    m_print(a, 5);
    binaryfind(a, 5, 0, 5, 3);
    delete[] a;
}

void test3()
{
    //for (int i = 0; i < 10; i++)
    //{
    //    cout << m_Fibonacci(i, 0) << "\t";
    //}
    for (int i = 0; i < 10; i++)
    {
        cout << m_Fibonacci(i, 1) << "\t";
    }
}

void test4()
{
    int a[] = { 57, 68, 59, 52, 72, 28, 96, 33, 24 };
    int len = sizeof(a) / sizeof(int);
    cout << "len = " << len << endl;
    m_Quick_sort(a, 0, len - 1);
    m_print(a, len);
}

void test5()
{
    const int len = 55000;
    int* a = new int[len];
    srand((unsigned)time(NULL));
    for (int i = 0; i < len; i++)
    {
        a[i] = rand() % len;
    }
    //   m_Bubble_sort(a,len);
    //   m_Quick_sort(a,0, len-1);
    m_Selection_sort(a, len);
    m_print(a, len);
    delete[] a;
}

运行成功:(注:你运行x86的dll就得用x86运行,x64同理)
在这里插入图片描述

在这里插入图片描述
以上是一种dll的静态链接使用。
参考文章链接如下
添加链接描述
添加链接描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高启强不卖鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值