Qt插件问题

- 问题出现情景

  开发的项目项目中用到了VS2008+Qt4.8.6,而且用到了Qt的数据库sqlite和gif,jpeg插件。调试开发的时候可以正常显示。但是制作出安装包安装之后却不能在windows 2003系统还有vista上显示。

  在加入了plugins下对应的插件目录,QApplication::addLibraryPath(),qtconf……之后依然无果。数据库插件不能加载,Gif图片也不能正常显示。

  这期间学习了Qt的插件机制,教程链接如下:
http://blog.csdn.net/dbzhang800/archive/2011/06/14/6543489.aspx
  这个教程差不多从源代码角度分析了,使用插件目录的必要性。查找Qt Assistant,照着上面的解决方案做了一遍。依然不能解决。补充一句:这个教程对于常见的插件缺失是完全可以解决的。楼主以前也碰到过类似的问题,就是插件目录位置不对,导致的。

- 查找问题所在

  经过一段时间的调研,确认是自己代码没问题。经过高人指点之后,那是不是系统有什么差异导致了问题出现?

  然后就去找两个表现不一样的Windows系统进行比对:

  最后发现在系统目录C:\Windows\winsxs下多了这么几个文件。
这里写图片描述

  非常奇怪的,就是这么几个类似的文件如果复制了到问题机器的对应目录C:\Windows\winsxs的话刚好能够解决此问题。这些文件是因为安装了Microsoft C++ Redistribution 2008的包产生的。

- 问题原因

  问题出现的原因,就要说一下这个C:\Windows\winsxs是干嘛的了。WinSxS (Windows side-by-side assembly,windows并行程序集),这个东西主要作用:

  WinSxS主要涉及到Windows的兼容性,比如一个软件需要XXXX.dll系统库(一般是系统库或者一些基础的runtime),Windows程序一般会先到这个目录下面去寻找对应版本的库(比如不同架构的CPU,arch,arm,x86都有自己的适配版本dll,可以观察对应的名称猜出大致用途)。找不到的话,就有可能就会出现很奇怪的问题。我们往往装机的时候会装一些运行时环境比如,Microsoft C++ Redistribution 2008的环境等等,VS2008之前的VS动态链接,都会在这个WinSxS的环境下加载自己的C运行时动态链接库 ,所以安装一个C++对应的运行时尤为重要,VS2010之后采取了直接复制VC运行时到System32目录下的做法,所以VS2010以后出现这个问题的概率会小很多。

  在用VS调试的时候,也会发现VS会去调用对应的WinSxS的dll。

这里写图片描述

  细心的你们可能会发现:
   很多windows上的软件在安装的时候都会执行这一步,………..\vcredist.exe /q,比如QQ客户端,还有qt对VS的开发包,包括VS-addin,安装的时候打开详情,就知道他安装第一步是先生成一个vcredist.exe到临时文件夹,然后静默/q安装执行这个文件。

  这个运行时环境相同版本重复安装的话,是无效的。静默安装不会覆盖。所以很多软件都是直接/q静默安装,不会出现啥毛病的。至于为啥加/q静默参数,是因为 : 静默参数下,vcredist.exe不会弹框让用户选择是否安装或者覆盖这些啥的。

  最后解决方法:安装上了VS2008 Redistribution,数据库也能用,动态Gif图片也能加载了。

猜你喜欢

转载自blog.csdn.net/moke_8453/article/details/53771147