【C++】动态库制作、修改与测试

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41374099/article/details/99704306

前言

这部分知识算是必须要掌握的吧。


我使用的是VS2017,其实我觉得哪个版本都没太大区别,VS2013或是VS2019。

第一步:创建DLL项目

在这里插入图片描述

第二步:新建类test&新建测试项目

APP这个项目和Dll_Try建立在一起:在解决方案’Dll_Try’上右击,选择添加新项目,选择Windows控制台项目。
在这里插入图片描述
APP是Windows控制台项目,用来测试制作的动态链接库。Dll_Try是制作DLL的项目。
新建的测试类就是test.h与test.cpp两个文件,单单建这两个文件就好了,内容反正是要重写的。这个DLL项目下的其他文件不用动

第三 步:给test.h&test.cpp添加内容

//test.h
#pragma once



#ifdef  TEST_EXPORT
#define TEST_API __declspec(dllexport)
#else
#define TEST_API  __declspec(dllimport)   
#endif



/*
	__declspec(dllimport)   原来dllimport是为了更好的处理类中的静态成员变量的,
								如果没有静态成员变量,那么没有__declspec(dllimport)无所谓。
*/




//非成员变量
extern TEST_API int dem;

class A {
public:
	//成员函数
	static TEST_API void output();
	static TEST_API void setVar(int var);

private:
	//成员变量
	static  int m_a;
};


//非成员函数
TEST_API void input();


//类
class TEST_API test
{
public:
	test();
	~test();

	int add(int a, int b);
};



//test.cpp
#include "stdafx.h"


#include<iostream>
#include "test.h"


//非成员变量初始化
int dem =20;

//成员变量初始化
int A::m_a=12;


//修改m_a
void A::setVar(int var) {
	std::cout << "Dll_Try>setVar function" << std::endl;
	m_a = var;
}
void A::output() {
	std::cout << "Dll_Try>"<<m_a << std::endl;
}

void input() {
	int a=0;
	std::cout << "Dll_Try>";
	scanf_s("%d", &a);
	std::cout << "Dll_Try>"<<a << std::endl;
}

test::test()
{
}


test::~test()
{
}

int test::add(int a, int b) { 
	std::cout << "Dll_Try>"<<a+b << std::endl; 
	return a + b; 
}

第四步:生成这个DLL项目

可以直接按CTRL+F5,笔记本上按CTRL+Fn+F5
或者在DLL项目上右击,选择生成。

  • 第一次生成一般不会出错,之后再生成就会出错了。无论修改成什么样,都会跳出无法启动DLL,这不是有效的Win32程序。

在这里插入图片描述

如果你真的修改了DLL项目,那么生成还是能做到的,输出还是会显示成功1,失败0.但是成功后还是会跳出这个错误,解决方法就是不用管,关掉这个框就行。

第五步:在APP这个项目里做测试

首先在解决方案’Dll_Try’右击,选择当前选定项目。
在这里插入图片描述
修改APP.cpp这个源文件

// APP.cpp 

#include "pch.h"
#include <iostream>
#include"..\Dll_Try\test.h"
#pragma comment(lib,"Dll_Try.lib")
using namespace std;

int main()
{
    
	test a;
	cout << a.add(23, 44) << endl;
	A b;
	b.output();//输出静态成员变量
	b.setVar(12213);//修改m_a
	b.output();//输出静态成员变量

	input();
	cout << "dem>"<<dem << endl;
	dem = 123;//修改dem
	cout << "dem>"<<dem << endl;

}

由于#pragma comment(lib,"Dll_Try.lib")这里似乎不能用相对路径,所以需要每次自己找到那两个静态库和动态库文件才行。
在这里插入图片描述
在这里插入图片描述

每次修改生成DLL项目后,都需要将这两个文件复制到APP项目下做测试。
在这里插入图片描述
编译运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41374099/article/details/99704306