Qt5部署Windows应用

本文地址:http://www.cnblogs.com/neochin/p/3267097.html

概述:

Qt5应用程序的部署与之前版本之间的差异,主要是需要增加Qt里plugins/platforms/下的dll的部署。

官方文档:http://doc-snapshot.qt-project.org/qt5-stable/qtdoc/deployment-windows.html

 

测试环境与工具:

Windows 8 64bit

Windows Xp 32bit

Qt 5.1.0 Mingw4.8 32bit 

Dependency Walker 2.2

 

步骤:

用简单的Qt Gui应用程序myapp举例说明。

  1. Release发布应用程序,并将该exe放到应用程序目录"/myapp/"中,目录结构为:"/myapp/myapp.exe"。
  2. 使用Dependency Walker打开myapp.exe,查看依赖的dll。也可以运行程序,记下 程序提示缺少的dll。
  3. 找到Qt的dll目录,我的在"D:\Qt\Qt5.1.0\5.1.0\mingw48_32\bin"下,把缺少的dll复制到"/myapp/"下(有些缺少的dll是系统目录下的,不用复制,你只用把qt dll目录有的复制过来即可)。此时双击程序已经可以运行了,但还没能部署完。
  4. 在"/myapp/"目录下,新建文件夹"platforms",把"D:\Qt\Qt5.1.0\5.1.0\mingw48_32\plugins\platforms"目录下的qwindows.dll(可能不只缺少这个dll,依情况而定)复制进来,目录结构为"/myapp/platforms/qwindows.dll",现在就成功部署了。

 

我还想问点为什么:

以下是自己测试得到的结论。

  • qwindows.dll是The Qt Windows platform plugin,对平台的支持使用插件的方式提供。
  • 在已安装了的Qt机器下,不复制qwindows.dll时,为什么程序也可以运行?QCoreApplication中有QCoreApplication::libraryPaths()函数及相关函数可以对库目录动态设置。通过以下代码:
    QApplication a(argc, argv);
    qDebug()<<a.libraryPaths();

    可得到默认的库目录,在我测试环境下目录为:"D:/Qt/Qt5.1.0/5.1.0/mingw48_32/plugins", "D:/projects/qt_code/build-myapp/release"。由第一个目录看得出来,为什么在自己机器上能默认找到platforms/qwindows.dll了。

  • 上一点中提到的plugins目录,应用程序是如何知道要去设置这个库目录的? 应用程序用什么方式得到Qt的安装目录,并取得标准插件目录?Qt目录是通过读注册表而来,还是Qt工程在编译的时候,就把安装目录固定死,植入了App.EXE中?       答案是:这个目录是固定死的,但是是在QtCore.dll中。  我想,这应该是Qt在安装的时候,修改过或是临时生成QtCore.dll,所以QtCore.dll中这个值,跟安装时候的配置有关。   下面可能就有这样一个问题:如果你的Qt在安装在D盘,后来你用剪切的方式,把Qt目录移到了E盘,QtCore.dll便不能帮你找到plugins/目录了。

 

posted @ 2013-08-19 04:17  neochin  阅读(1951)  评论(0编辑  收藏  举报