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
步骤:
用简单的Qt Gui应用程序myapp举例说明。
- Release发布应用程序,并将该exe放到应用程序目录"/myapp/"中,目录结构为:"/myapp/myapp.exe"。
- 使用Dependency Walker打开myapp.exe,查看依赖的dll。也可以运行程序,记下 程序提示缺少的dll。
- 找到Qt的dll目录,我的在"D:\Qt\Qt5.1.0\5.1.0\mingw48_32\bin"下,把缺少的dll复制到"/myapp/"下(有些缺少的dll是系统目录下的,不用复制,你只用把qt dll目录有的复制过来即可)。此时双击程序已经可以运行了,但还没能部署完。
- 在"/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/目录了。