Qt静态库的下载和安装配置(QML/QtQuick修正)
(2015.03.31 by Winland)
在Windows下使用Qt开发最后都是要发布程序的,Qt官方的库都是动态链接库,如果发布就需要一大堆的dll,而且还要记得复制plugins/platforms里面的插件,如果用到各种格式图片还要plugins/imageformats里面的插件,所以东西会越弄越多。针对Windows部署基于Qt的软件,Qt官方有专门文档:
http://doc.qt.io/qt-5/windows-deployment.html
对于动态版本程序发布,官方Qt库里面也带了专门部署工具:QTDIR/bin/windeployqt ,这个本人也没用过,感兴趣的可以自己试试。
本文主要讲Qt静态库的下载、安装和配置使用。使用静态Qt编译的程序只需要一个exe文件,就可以走遍天下都不怕。可以自己根据Qt的源代码编译自己的静态版本Qt库,但这个过程非常耗费时间,而且如果有问题还要重新编译,比较麻烦。幸好网上有现成编译好的静态库,所以给新手和懒人提供了方便。
一、Qt Static Builds 下载
在网上寻找Qt静态库,就搜索Qt Static Builds ,目前找到两个地方有:
https://www.doczj.com/doc/e150947.html,/projects/static-qt/
https://https://www.doczj.com/doc/e150947.html,/fostersoftware/QtStaticWindows
第一个是SourceForge上的项目,第二个是GitHub上的项目,这两个网站希望新手记牢了,以后要找好东西都可以去这两个网站。
GitHub上面的QtStaticWindows比较新,是5.3.2版本的,所以就选这个来做教程示范。
从GitHub网站下载东西,可以直接点击网页右边“Download ZIP”
但是这个下载可能比较卡比较慢,也可能挂掉。推荐的是安装git工具,新建QtStatic目录,在该目录里执行命令:
git clone https://https://www.doczj.com/doc/e150947.html,/fostersoftware/QtStaticWindows.git
然后等待下载完成,文件就会出现在QtStaticWindows子目录里面。
国外网站速度慢正常,所以本人打包好了一个放在百度网盘分享:
https://www.doczj.com/doc/e150947.html,/s/1nt3d0jZ
位于QtSDK/QtStatic/QtStaticWindows5.3.2.7z
从百度网盘下载即可。
QtStaticWindows5.3.2.7z里面仅仅包含静态编译的Release版Qt库,
仅用于生成程序发布,不便于调试,这个文件里面也没有开发环境,仅仅是一个库。所以要配合Qt官方的开发环境来使用,集成到官方QtCreator里面用。
目前Qt最新的官方开发环境下载页面:
http://download.qt.io/official_releases/qt/5.4/5.4.0/
下载MinGW版本:qt-opensource-windows-x86-mingw491_opengl-5.4.0.exe
也可以从刚才的网盘链接下载:https://www.doczj.com/doc/e150947.html,/s/1nt3d0jZ
位于QtSDK/Qt5/qt-opensource-windows-x86-mingw491_opengl-5.4.0.exe
安装官方Qt开发环境时,记得把全部组件都选中安装!
二、Qt静态库安装
1、Qt官方开发环境安装
运行qt-opensource-windows-x86-mingw491_opengl-5.4.0.exe
点击下一步,
可以使用默认路径,如果C盘空间不够就装其他盘根目录。点击下一步,
选择组件界面里,默认没有选中源代码组件和MinGW编译调试环境,
点击“全选”按钮,把所有组件都选中(Tools/MinGW4.9.1必须要装),点击下一步,
选择agree,点击下一步,
这是开始菜单设置,点击下一步,
点击安装,等待安装完成,点击下一步,
点击完成,会打开QtCreator。把QtCreator最小化,等会配置。
2、QtStaticWindows安装
将QtStaticWindows5.3.2.7z直接解压到比如C:\Qt,也可以放在其他分区。
这时候qmake.exe位置是:C:\Qt\QtStaticWindows\5.3.2\bin\qmake.exe
检查C:\Qt\QtStaticWindows\5.3.2\bin\ 有没有qt.conf文件,
从GitHub直接下载的QtStaticWindows是没有qt.conf文件,如果bin目录没有,
那么从C:\Qt\Qt5.4.0\5.4\mingw491_32\bin目录复制一个到静态库的bin目录。
三、Qt静态库的配置
1、Qt Versions配置
Qt官方开发环境和静态库都安装了,还要把静态库集成到QtCreator里面。
打开QtCreator的菜单“工具”--》“选项”,
然后对话框左边选择“构建和运行”,
在构建和运行页面,右边选择“Qt Versions”,
点击右上角“添加”,会弹出查找qmake.exe的对话框,找到刚才装的
C:\Qt\QtStaticWindows\5.3.2\bin\qmake.exe
点击确定,就看到新的Qt库:
点击右下角Apply按钮,应用配置。
注意一个问题,如果静态库bin目录没有qt.conf文件,会出现如下错误:
"Qt没有被正确安装,请运行make install"
可以按照:https://www.doczj.com/doc/e150947.html,/andy65007/p/3493309.html修复问题,
或者按照前面说的复制一个qt.conf到静态库bin目录,然后重新尝试添加静态库。
2、构建套件(Kit)配置
还是刚才的配置对话框,在构建运行配置页面,点击“构建套件(Kit)”,
点击右上角“添加”,
修改名称为QtStatic,修改Qt 版本为刚才添加的Qt 5.3.2 (5.3.2) ,
编译器就用默认的MinGW,调试器用默认的gdb。
然后点击“Apply”按钮,再点击“OK”。
3、新建项目测试
打开QtCreator菜单“文件”--》“新建文件或项目”,
选择Qt Widgets Application,点击“Choose”,
用默认的路径,点击下一步进入Kit Selection
两个都选上,第一个是官方Qt库,第二个是Release版静态Qt库。然后点下一步,点完成。
进入代码编辑主界面:
点击左下角Debug字样,会弹出编译套件选择和编译版本选择:
一般使用官方Qt库的Debug版本编译并调试程序,在确认没有问题之后,
选择QtStatic + Release 编译方式,生成可发布的exe程序。
比如上面例子的就在项目路径..\build-untitled-QtStatic-Release\release\untitled.exe
这里生成的是14.1MB,直接双击可以运行,不需要配置依赖,也没什么依赖。
4、(可选)压缩exe后再发布
如果嫌14.1MB还大,那就用UPX Shell压缩一下,
压缩之后只有7.38 MB,也是可以独立运行的,可以无脑发布了。
工具UPX Shell也放到之前的百度网盘分享里面,读者可以试试看。
四、QML/QtQuick 程序问题修正
按照上面安装方式,新建的Qt Quick Applicaition 编译能够成功,运行时会出错,报错为:
QQmlApplicationEngine failed to load component
qrc:/main.qml:2 module "QtQuick.Controls" is not installed
qrc:/main.qml:1 module "QtQuick" is not installed
qrc:/main.qml:2 module "QtQuick.Controls" is not installed
qrc:/main.qml:1 module "QtQuick" is not installed
这个问题如鲠在喉,折磨了作者很久,后来才找到看可行的办法:
解决参考
http://forum.qt.io/topic/45364/how-to-surpress-qml-plugins-to-be-built-statically
经过测试,方法一:
将生成的 .exe 放到QTDIR/qml 文件夹里可以正常运行。
这个如果用于发行,需要拷贝QTDIR/qml 文件夹里面的组件。
方法二是真正的实现一个exe 发布,修改main.cpp 代码,如下示范:
#include
#include
//1.add headers
#include
#include
//2.add Q_IMPORT_PLUGIN
#if defined(QT_STATIC)&&!defined(Q_OS_MAC)&&!defined(QT_NAMESPACE)
#include
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
Q_IMPORT_PLUGIN(QtQuick2Plugin)
Q_IMPORT_PLUGIN(QtQuickControlsPlugin)
Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin)
Q_IMPORT_PLUGIN(QtQuick2WindowPlugin)
#endif
int main(int argc,char*argv[])
{
QApplication app(argc,argv);
QQmlApplicationEngine engine;
//3.registerTypes
#if defined(QT_STATIC)&&!defined(Q_OS_MAC)&&!defined(QT_NAMESPACE)
qobject_cast
qobject_cast
qobject_cast
qobject_cast
qobject_cast
qobject_cast
qobject_cast
->initializeEngine(&engine,"QtQuick");
qobject_cast
qobject_cast
qobject_cast
qobject_cast
#endif
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
改了main.cpp 之后重新编译得到的exe 就可以正常独立运行了。
注意上面修改的代码仅对MinGW 版本Static Qt 有用,Visual Studio静态编译的Qt 不会出现找不到组件的问题,不需要修改main.cpp 代码。
上面增加的代码是最基本的QML组件,如果要添加新的QML组件比如QtMultimedia,如下示范:
对于import QtMultimedia 5.0 的QML,导入静态插件和QtQuick没啥区别。
对于QtQuick,找到qml\QtQuick.2\qmldir 文件,内容为
module QtQuick
plugin qtquick2plugin
classname QtQuick2Plugin
typeinfo plugins.qmltypes
对于QtMultiMedia,找到qml\QtMultimedia\qmldir
module QtMultimedia
plugin declarative_multimedia
classname QMultimediaDeclarativeModule
typeinfo plugins.qmltypes
Video 5.0 Video.qml
参照main.cpp 里的代码,最重要的就是classname 和module ,仿造main.cpp里的三句
Q_IMPORT_PLUGIN(QtQuick2Plugin) //使用类名
////////////////////
qobject_cast
//////////////////
qobject_cast
->initializeEngine( &engine, "QtQuick"); //使用带类名的函数和模块名字符串
添加导入QtMultimedia 的三句代码放到类似的位置:
Q_IMPORT_PLUGIN(QMultimediaDeclarativeModule)
//////////////////////////////
qobject_cast
////////////////////////////
qobject_cast
当然,使用多媒体还需要在pro 添加Qt 模块multimedia
QT += multimedia
并且包含头文件
#include
就这些,然后重新编译程序就是一个正常的静态exe。
其他的QML插件都是类似使用,找到该模块的qmldir文件,
依葫芦画瓢就搞定了。