注意!!如果要被C#调用,则必须选择msvc编译器!!本文用的MinGW-32做演示
本文中谈的是用QT封装一个包含界面的DLL,然后在其他任何地方使用任何语言来调用这个DLL,不是那种在qt creator里面建一个dll工程,然后再在qt creator里建一个调用该dll的工程的情况(这种示例可参考该链接 http://download.youkuaiyun.com/source/2855817)
在qt creator中是可以直接建立一个C++ DLL工程的,编译以后也可以生成dll,但是这样生成的dll拿VC去调是不会成功的。后来在优快云上看到有人发的这样一篇帖子(原文链接http://blog.youkuaiyun.com/normallife/article/details/5397980)。里面谈到 “因为 QT 必须有调用 QApplication 的 exec 方法,这样才能产生消息循环, QT 的程序才可以运行。所以说如果我们使用了 QT 编写了 dll 程序,在普通的 windows 程序中是不能调用的。在调用的时候会出现错误。当然 QT 提供了解决方法:那就是 QTWinmigrate”。
1.下载QTWinmigrate qtwinmigrate资源包-QT文档类资源-优快云下载
2.找到资源包中的qtwinmigrate文件夹,将这个文件夹单独复制到一个文件夹里
3.进入【qtwinmigrate】-【examples】-【qtdll】,qtdll 整个文件夹是我们直接拿来使用的文件夹,我们只需要将 qtdll.pro 修改成我们需要的样子即可。
4.打开 qtdll.pro ,选择合适的编译器,这里我选择 MinGW 32-bit
5.在项目中插入一个ui界面。
右键树头文件 qtdll -【Add New...】-【Qt】-【Qt设计师界面类】-【choose】
6.给界面起个名~
7.这里的ui界面根据个人需求随便画。我只实现一个小功能,方便在VS中调用的时候做测试。
点击一下【pushbutton】输出一个【“Congraduations!”】
8.下面修改 main.cpp 文件。
先将 uidll 的头文件包含进去,再将黄色框框里的代码进行替换
将DLL发布接口函数的部分修改为如下代码:
其中******是你界面文件的.h文件中定义的界面类名
extern "C" __declspec(dllexport) int main(int argc, char *argv[])
{
QApplication a(argc, argv);
****** w; //*****是界面类的名字,如QWidget。w不需要改变
w.show();
return a.exec();
}
9.将【Debug】换成【Release】,然后点个锤子构建项目。回到qtdll同级目录,出现下面这个说明构建成功,注意,是MinGW32-Release
10.进入【build-qtdll-Desktop_Qt_5_12_11_MinGW_32_bit-Release】-【release】
这个文件就是包含我们 ui 界面的 dll 文件了
二. 生成依赖库
1.创建一个新的文件夹,这个文件夹就是整个ui界面所有需要被调用的文件打包,把上面的 dll 文件复制进去,只复制dll文件即可!
我的路径: E:\QtDll
2.打开MinGW-32的终端,依次输入下面的黄字。点击回车后开始在QtDll文件夹内自动添加各种依赖库
完成后的文件夹如下:
如果我们需要调用这个ui文件,就把整个文件夹复制到对应的VC项目里就可以了
目前还没有调用成功,先写到这,以后再补充