搜档网
当前位置:搜档网 › Qt静态库的下载和安装配置-修正

Qt静态库的下载和安装配置-修正

Qt静态库的下载和安装配置-修正
Qt静态库的下载和安装配置-修正

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.sodocs.net/doc/6c14221117.html,/projects/static-qt/

https://https://www.sodocs.net/doc/6c14221117.html,/fostersoftware/QtStaticWindows

第一个是SourceForge上的项目,第二个是GitHub上的项目,这两个网站希望新手记牢了,以后要找好东西都可以去这两个网站。

GitHub上面的QtStaticWindows比较新,是5.3.2版本的,所以就选这个来做教程示范。

从GitHub网站下载东西,可以直接点击网页右边“Download ZIP”

但是这个下载可能比较卡比较慢,也可能挂掉。推荐的是安装git工具,新建QtStatic目录,在该目录里执行命令:

git clone https://https://www.sodocs.net/doc/6c14221117.html,/fostersoftware/QtStaticWindows.git

然后等待下载完成,文件就会出现在QtStaticWindows子目录里面。

国外网站速度慢正常,所以本人打包好了一个放在百度网盘分享:

https://www.sodocs.net/doc/6c14221117.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.sodocs.net/doc/6c14221117.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.sodocs.net/doc/6c14221117.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(qt_static_plugin_QtQuick2Plugin().instance())->registerTy pes("QtQuick");

qobject_cast(qt_static_plugin_QtQuickControlsPlugin().instance())->reg isterTypes("QtQuick.Controls");

qobject_cast(qt_static_plugin_QtQuickControlsPlugin().instance())->reg isterTypes("QtQuick.Controls.Private");

qobject_cast(qt_static_plugin_QtQuickControlsPlugin().instance())->reg isterTypes("QtQuick.Controls.Styles");

qobject_cast(qt_static_plugin_QtQuickLayoutsPlugin().instance()) ->registerTypes("https://www.sodocs.net/doc/6c14221117.html,youts");

qobject_cast(qt_static_plugin_QtQuick2WindowPlugin().instance()) ->registerTypes("QtQuick.Window.2");

qobject_cast(qt_static_plugin_QtQuick2Plugin().instance())

->initializeEngine(&engine,"QtQuick");

qobject_cast(qt_static_plugin_QtQuickControlsPlugin().instance())->ini tializeEngine(&engine,"QtQuick.Controls");

qobject_cast(qt_static_plugin_QtQuickLayoutsPlugin().instance()) ->initializeEngine(&engine,"https://www.sodocs.net/doc/6c14221117.html,youts");

qobject_cast(qt_static_plugin_QtQuickLayoutsPlugin().instance()) ->initializeEngine(&engine,"https://www.sodocs.net/doc/6c14221117.html,youts");

qobject_cast(qt_static_plugin_QtQuick2WindowPlugin().instance()) ->initializeEngine(&engine,"QtQuick.Window.2");

#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(qt_static_plugin_QtQuick2Plugin().instance())->registerTy pes("QtQuick"); //使用带类名的函数和模块名字符串

//////////////////

qobject_cast(qt_static_plugin_QtQuick2Plugin().instance())

->initializeEngine( &engine, "QtQuick"); //使用带类名的函数和模块名字符串

添加导入QtMultimedia 的三句代码放到类似的位置:

Q_IMPORT_PLUGIN(QMultimediaDeclarativeModule)

//////////////////////////////

qobject_cast(qt_static_plugin_QMultimediaDeclarativeModule().instanc e())->registerTypes("QtMultimedia");

////////////////////////////

qobject_cast(qt_static_plugin_QMultimediaDeclarativeModule().instanc e()) ->initializeEngine( &engine, "QtMultimedia");

当然,使用多媒体还需要在pro 添加Qt 模块multimedia

QT += multimedia

并且包含头文件

#include

就这些,然后重新编译程序就是一个正常的静态exe。

其他的QML插件都是类似使用,找到该模块的qmldir文件,

依葫芦画瓢就搞定了。

相关主题