QT上位机开发(动态库dll的开发)

发布时间:2024年01月05日

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

? ? ? ? 有的时候,我们不想把所有的代码都放在一个exe里面,这个时候我们就需要引入dll动态库的概念。在windows平台上面,这个动态库就是dll文件,在linux平台上面,这个动态库就是so文件。不管是哪一种形式,它们的运行方式都是差不多的,那就是执行文件调用到具体函数的时候,才会跳到动态库执行。dll还有一个好处,那就是可以帮助我们提炼函数、类接口,实现程序的动态加载。这样软件除了问题之后,不需要重新编所有的代码,只需要更新指定的dll文件就可以。

? ? ? ? 今天我们在编写qt软件的时候,正好也可以学习下在cpp下,函数和类是怎么做到dll里面的,且能被外面的代码调用。

1、创建一个qt widget项目

? ? ? ? 和之前一样,创建一个qt widget项目,这个项目只是为了演示。不需要用widget在里面添加任何的内容。

2、在当前的solution里面添加一个dll项目

? ? ? ? 直接选择solution、添加、新建项目,选择动态链接库,确认就好。这样一个dll项目就被添加到这个项目里面来了。

3、添加导出函数代码

? ? ? ? 为了测试,我们添加一个测试函数。函数的话,按照正常的方法编写就可以了。不过有两个地方需要注意下,第一,就是需要添加一个extern "C";第二,就是添加_declspec(dllexport)。这样后续的exe文件,就可以看到这个被export出去的函数了。

// about function export
extern "C" _declspec(dllexport) int iterate(int data)
{
	if(data == 1)
		return 1;

	return iterate(data - 1) + data;
}

4、添加导出类代码

? ? ? ? 除了函数,还有一些类也是要被导出来的,其实也是一样。不过和函数相比较,类如果需要导出的话,只需要添加一个_declspec(dllexport)就好了。

// about class export
class _declspec(dllexport) parent
{
public:
	parent() {}
	~parent() {}
	parent(parent&) {};
	void display() { std::cout << "display function was invoked here!" << std::endl; }
};

5、在exe可执行文件中添加函数和类的引用

? ? ? ? 前面我们在dll当中已经实现了需要导出的函数和类。那么在exe当中如果需要使用这些类和函数的话,也需要添加相关的代码,比如像这样,

// about function import
extern "C" _declspec(dllimport) int iterate(int);

// about class import
class _declspec(dllimport) parent
{
public:
	parent();
	~parent();
	parent(parent&);
	void display();
};

6、先编译dll,然后在exe中引入dll

? ? ? ? 代码准备好了之后,就可以先编译dll。因为编译好了之后,就可以把dll库导入到exe项目当中去了。

7、exe项目中添加代码,开始测试

? ? ? ? 所有条件都准备好了,就可以添加代码测试了,

	// test code here
	int aa = iterate(10);
	parent pp;
	pp.display();

? ? ? ? 测试的时候,可以添加断点,比如iterate是不是可以单步调试?单步调试的时候会不会跳到dll工程去?parent实例化是否成功?实例化的时候,是否可以跳到构造函数去?display类函数是不是可以执行到,是不是可以跳到dll里面去等等?这些问题都可以通过单步调试来进行处理和验证。

文章来源:https://blog.csdn.net/feixiaoxing/article/details/135408434
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。