【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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 hereint aa = iterate(10);parent pp;pp.display();
测试的时候,可以添加断点,比如iterate是不是可以单步调试?单步调试的时候会不会跳到dll工程去?parent实例化是否成功?实例化的时候,是否可以跳到构造函数去?display类函数是不是可以执行到,是不是可以跳到dll里面去等等?这些问题都可以通过单步调试来进行处理和验证。