Qt 纯C++项目发布为dll的方法(超详细步骤)

众所周知,我们可以将C++项目中的类以及函数导出,形成 .dll 文件,以供其他程序使用,下面将说明Qt环境下的使用方法。

首先创建共享库,步骤如下

Qt 纯C++项目发布为dll的方法(超详细步骤)_第1张图片

Qt 纯C++项目发布为dll的方法(超详细步骤)_第2张图片

 Qt 纯C++项目发布为dll的方法(超详细步骤)_第3张图片

 下一步会出现类对话框等等,不用管它,直接点击创建即可,稍后再将类都删了。

创建好以后你会发现有一个包含global的头文件,这个文件中定义了__declspec(dllexport)、__declspec(dllimport)等,也可以删掉(如果要按照下面的方法的话,删掉即可)。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

接下来还有重要的一步,请在.pro文件中,加入

CONFIG += dll //即使你的代码中写成了 CONFIG += staticlib,也要改过来

接下来就开始我们具体的的创建方法吧!

按照导出dll的的操作划分,有两种模式:

  • 导出普通方法(导出后可静态调用,也可动态调用)

首先是头文件内容:

 1 头文件:
 2 在方法声明时,前面加上__declspec(dllimport),也可用#define定义,看代码:
 3 //为了和将来用到的程序中公用一个头文件,创建dll时用到的是__declspec(dllexport),而使用dll时用到__declspec(dllimport),完全可以各自写一下
 4 #define TESTDLLSHARED_EXPORT __declspec(dllexport)
 5 #ifdef TESTDLLSHARED_EXPORT
 6 #else
 7 #define TESTDLLSHARED_EXPORT __declspec(dllimport)
 8 #endif
 9 
10 //下面我要定义4个普通函数:
11 TESTDLLSHARED_EXPORT int test1();
12 
13 TESTDLLSHARED_EXPORT int test2(void);
14 
15 TESTDLLSHARED_EXPORT int test3(int a);
16 
17 TESTDLLSHARED_EXPORT int test4(int a,int b);

然后在对应的cpp源文件中实现test1、test2、test3、test4这几个方法(为了简单,我只输出了一句话):

 1 .cpp源文件://记得加上上面的头文件
 2 //记得加上iostream头文件,不然cout不能用
 3 
 4 int test1()
 5 {
 6     std::cout<<"test1"<

接下来就可以创建了,创建成功后(创建失败请仔细检查,代码已验证过),你会在你的项目输出目录下找到一个和项目名称一致的.dll文件。

OK!接下来我们来使用这个dll:

使用dll时有两种调用方法,一种是静态调用,一种是动态调用。

  • 静态调用

首先,创建一个常规的C++项目,将上面生成.dll复制到你的项目输出目录中(也就是和.exe文件在一起);

接下来,打开常规C++项目中的.pro文件,加入详细的.dll文件地址,格式如下

LIBS += 项目输出路径\dll文件全称

如我的就是

LIBS += D:\Desktop\Go\C++learnProgram\Qt\build-test_dll-Qt-Release\release\HpTickDll.dll
D:\Desktop\Go\C++learnProgram\Qt\build-test_dll-Qt-Release\release是我的项目输出路径,HpTickDll.dll是我的dll文件,使用时改动一下就好

接下来,将创建.dll文件时的头文件复制到当前项目路径下,并添加到项目中,注意:如果你没有按照我上面的#define条件定义方式,请重新写__declspec(dllimport)。

接下来,在.cpp文件中包含该头文件,就可以尽情地使用之前的函数了,如直接用test1()等等,就和平时编写一样的。

  • 动态调用

!!!特别注意:我们在创建时没有用到extern "C",也没有用到.def 文件保持函数名不变(尝试了很多次也不会用.def文件,会的欢迎留言),因此动态调用时函数名要改!因为编译器已经将函数名改了!

So,你一定会问我们怎么知道dll中的函数名变成啥了?不要着急,网上直接搜“.dll查看器”,遍地都是,下载下来后,选择我们刚才的.dll文件就可以看了,下面是我们的这几个函数test1、test2、test3、test4的新名称(你的可能和我的不一样哦):

Qt 纯C++项目发布为dll的方法(超详细步骤)_第4张图片 

请注意看红色框中的部分(不要管其他的,我的文件里面还有其他东西),这就是四个函数在.dll文件中的名称,我小小地猜测了一下,后面的v代表参数为void类型,i的个数代表int类型参数的个数,前面的字母就不太清楚了(注意:参数个数并未正确列出,不过我们只需要正确的函数名,不影响)。

OK!这就好办了!看步骤:

同样是创建一个常规C++项目,不同的是.pro文件中不用加“LIBS += 项目输出路径\dll文件全称”这句话了。

接下来在.cpp文件中写主代码(不用添加之前的头文件):

 1 #include 
 2 #include 
 3 
 4 int main()
 5 {
 6     //首先定义函数指针,用来接收不同参数的函数
 7     typedef int (CALLBACK *Fucv)();
 8     typedef int (CALLBACK *Fuci)(int);
 9     typedef int (CALLBACK *Fucii)(int,int);
10     //获得.dll文件的句柄,需要头文件windows.h的支持
11     HINSTANCE hdll=LoadLibrary(L"testDll.dll");     //L指宽字符串,若不写L,则会出现错误,详情请自查
12 
13     //注意这里要用.dll文件中的函数名
14     Fucv t1=(Fucv)GetProcAddress(hdll,"_Z5test1v");
15     Fucv t2=(Fucv)GetProcAddress(hdll,"_Z5test2v");
16     Fuci t3=(Fuci)GetProcAddress(hdll,"_Z5test3i");
17     Fucii t4=(Fucii)GetProcAddress(hdll,"_Z5test4ii");
18 
19     //现在的t1就执行的test1的功能,以此类推
20     t1();
21     t2();
22     t3(1);
23     t4(1,2);
24 
25     FreeLibrary(hdll);
26 
27     return 0;
28 }

以上就是普通函数创建.dll和使用.dll的方法,看起来动态调用是不是很麻烦?但它有许多优点(请自查),而且据说这里的函数名可以利用.def文件实现不改变名称,省去好多麻烦,但是我尝试了各种方法,如在.pro中利用DEF_FILE添加.def文件还是不行55555,会的可以留言哦!

  • 导出类及其成员函数(导出后可静态调用。暂时不会动态调用,某些书上说类不支持动态调用,网上有说在类中写一个方法返回类对象,但是个人认为这种做法是不对的,因为此时肯定是用自己定义的函数指针去定义这个返回类对象方法,不可能成功【已验证】,当然或许还有更好的方法,有知道的欢迎交流哈)

对于类的话,创建时:在class的后面,类名的前面加上定义的__declspec(dllexport);使用时,换成__declspec(dllimport),也可以参照前面的#define条件定义法。举例:

 1 #define HPTICKDLLSHARED_EXPORT __declspec(dllexport)
 2 #ifdef HPTICKDLLSHARED_EXPORT
 3 #else
 4 #define HPTICKDLLSHARED_EXPORT __declspec(dllimport)
 5 #endif
 6 
 7 class HPTICKDLLSHARED_EXPORT HpTickDll  //我在这里定义了类HpTickDll
 8 {   
 9 public:
10     int  Start();                       //注意成员函数之前不用加HPTICKDLLSHARED_EXPORT
11     int  GetTime();
12 
13 private:
14 
15     LARGE_INTEGER li;
16     LONGLONG start, end, freq;
17     int useTime;
18 };

静态调用的方法和普通函数一样,直接可以使用类及其成员函数(别忘了添加头文件),就不细说了。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

你可能感兴趣的:(QT开发,c++,qt,qt教程,qt开发,qt编程)