Qt 关于自定义插件的学习

Qt的三个编译器版本

Qt拥有三种编译器,以我的Qt版本为例,他有如下三个编译器!

       Qt的插件有专门的创建步骤,这里就不讲解了,自定义的插件最后以动态库形式存在,好了,我开始说下我遇到的抗。

动态库版本注意事项

       首先我要说,你用某一编译器编译的可执行程序,他调用的所有的动态库,都必须是同一个编译器编译生成的动态库!!并且release版本的程序对应release版本的dll,debug版本的程序对应debug版本的dll。这点请牢记心!!!

       同时,我们尽量开发的程序所用的dllQt版本一致,为什么呢?因为Qt随着版本更迭,数据的表示,位数,数据的内部设计都可能改变,可能导致二进制兼容问题,所以我们也要保证Qt版本的一致,以避免不必要的麻烦。

我的疑惑

第一个疑惑:为什么自定义插件只能用固定的msvc编译器编译??

       如上图所示,我的Qt Creator是MSVC 2015 32位编译器生成的,而前面我们说了,自定义的插件是以动态库dll形式调用的,同时他可视化出现在Qt Designer,如下图显示一样,这意味着什么?意味着Qt Creator这个可执行程序,调用了dll,这就是为啥设计自定义插件,编译器只能选择跟Qt Creator一个版本的编译器!
 

      下图文件夹存放的就是可视化设计程序Qt Designer调用的插件的dll存放地方,你所谓的可视化,不过是Qt Designer调用插件dll显示而已。由于我们用的Qt Designer是发布版本,所以只需要在里面放release版本的插件的dll

当然有的可视化插件放在这里

第二个疑惑:可不可以用不同于Qt Creator编译器编译自定义插件?

       宝,肯定可以的,这里书上写错了,第一个问题已经说明了,用msvc编译的release版本的dll放在对应路径不过是为了能在release版本的Qt  Designer中显示而已。至于在应用程序中使用自定义插件时,编译时调用的自然是对应编译器版本的自定义插件的dll。看下图,我们用MinGW编译自定义插件动态库,并把dll放到对应的位置

如上图所示,是可以运行的。

第三个疑惑:为什么我们在集成平台编译运行使用了自定义插件的程序,就能够运行,而在release或debug文件夹里运行exe就出错?(此时release或debug里用的是msvc 32位编译器编译的)

如下图所示

       什么鬼?还歧视运行程序的位置??看报错,是动态库链接的错,但我们已经把dll丢进来了,那必然不是我们写的插件的dll的错,那只能是调用Qt自有的dll的错了,前面我们也说了,可执行程序与他调用的dll。编译他们的编译器必须一样。而且release与debug也要对应 问题显而易见,我们去看path变量。果然只有mingw编译器的资源位置

如下图所示,这个三编译器有他们自己的资源总和文件夹。
点入其中一个如图可见,三个编译器对Qt的各种模块都有相应版本的dll,并且分为release与debug版本。

 把MSVC 2015 32位的路径丢进path变量并且要让他排在mingw53的前面

再在release里运行,哦了

       那么为什么在集成平台就不用配置环境变量,但每个版本的编译器都能运行程序?那是因为集成平台内部就会根据编译器的版本使用不同的动态库。这样也显的智能,让用户方便,但当你脱离集成平台运行时,那就只能依赖系统的那俩板斧子---------当前所在地,path变量。 

       最后我们要打包程序,由于我们使用程序用的是msvc 2015 32位编译器生成的,所以打包用到的windeployqt.exe必须是相应版本的。当然我们还要配置一个变量

然后整一个文件夹,丢入你的自定义插件的dll与使用它的可执行程序

然后输入命令 


 

猜你喜欢

转载自blog.csdn.net/qq_41607336/article/details/118117653