Qtのプログラムガイドをリリース
マイティTaogeのブログ記事は対処 https://jaredtao.github.io/2019/09/02/Qt%E5%AE%9E%E7%94%A8%E6%8A%80%E8%83%BD6-を%E7%A8%8B%E5 %BA%8F%E5%8F%91%E5%B8%83%E6%8C%87%E5%8D%97 /
ほとんどの記事のアドレスを知っている https://zhuanlan.zhihu.com/p/80919147を
簡単な紹介
この記事では、第六の記事「Qtの実践的なスキル」シリーズ、ここで説明Taogeの知識はQtアプリケーションをリリースしています。
(まだ数日で仕上げパートV「のQtの実践的なスキルを習得するためのシグナルとスロット5使用方法の詳細は、」発行されます)
背景
Taogeに多くの人々が一つのチュートリアルをたくさん見つけることができますが、Qtのプログラムは、ウェブ上で公開質問をしたが、あまり信頼性があります。
この時間のように、より多くの人々を助けることを期待して、詳細にプログラムの知識のQtのリリースの一部を仕上げ、私の最高のラウンドを行います。
ベテランのために、多くの人が何よりも正しい道で右のdllよりも、ピットに強化しています。
手始めに、詳細にはいくつかの単語を言うことができ、大きな助け、迂回路、数時間保存、または数日だろう可能です。
記載漏れ、誤り、および追加を歓迎するがある場合は、私を修正。
Qtのインストール
このアドレスでダウンロードするQtの公式サイト: http://download.qt.io/official_releases
オンラインまたはオフラインインストールパッケージのインストールパッケージが行います。
選択肢のQtのバージョンについて、Taogeの推奨事項:
体验新特性,就用最新版本;项目开发,用长期支持版(LTS)的最后一个修正版本,稳定、bug最少。
あなたは、公式のQt Wikiの情報を表示することができます https://wiki.qt.io/Main
これまでのところ(2019年9月2日)、最新バージョンでは、LTSのバージョン5.9と5.12、および5.9最後に修正されたバージョンは5.9.8で、5.13.0である5.12.4へ5.12
図の例では、インストールパッケージは、オフライン5.9.8で実行可能なプログラムは、Windows、MacおよびLinuxシステムの3種類を提供します。
前記ウィンドウ設定「QT-オープンソース・windoiws-x86-5.9.8.exe」、2.4Gの大きさと、その
それはmsvc_x86、msvc_x64、mingwの、Androidや他のQtツールチェーンの複数のバージョンが含まれています。ダウンロードが完了して、インストール
プロセスが個別に確認することができます。他のバージョンも同様です。
Qtのインストール方法、他のすべては、エントリーレベルのチュートリアル、それを参照するために失敗した、手の込んだありません...
Qtのディレクトリ構造
我々は、Qtの、Qtは、物事が何であるかがインストールパスで最初の一見のための準備ができていることが想定されます。
QtのバージョンインストールされているWindows 10システムを使用してTaogeは、他のシステムと実際の被写体のバージョンを説明するための一例として、5.12.4です。
Qtのインストールパス
示すように、\オンラインパスの下に\ Qtの:TaogeはDにインストール:
「vcredist」フォルダがmsvc2015とのmsvc2017インストーラランタイムライブラリが含まれている場合(バックを使用する方法を言うだろう、必要としないではないMSVCコンパイラ)
「ツール」QtCreatorを含むフォルダ、OpenSSLライブラリ(別売)とMinGWの2つのバージョン(オプション)。
(さらにQt3DStudioは、無視できる程度あります)
「5.12.4」フォルダ、パスはQtの、ヘッダファイルの複数のバージョン、ダイナミックリンクライブラリが含まれているQtのツールチェーンの心臓部であります
ここでTaoge msvc2017、msvc2017_64インストール、mingw73_64とandroid_x86。
注msvc2017 x86アーキテクチャQtライブラリ、msvc2017_64は、x64アーキテクチャです。
msvc2013があった場合は、msvc2015も共感します。
Qtのコア・パス
例えばmsvc2017_64フォルダに次コア焦点の経路を見て、Qtの、
binフォルダは、DLL、EXEプログラムQtは様々なツールだけでなく、ダイナミックリンクライブラリを提供含まれています
ツールはqmake.exeとwindeployqt.exeを含み、windeployqt.exeは、我々が今日議論している主なツールです。
动态链接库全部是两份dll,比如Qt5Cored.dll和Qt5Core.dll,文件名末尾带’d’表示debug版本的,另一个不带’d’的是release版本。
debug版本和release版本的主要区别:debug没有开编译器优化、携带了调试信息,release开了编译器优化O2,去掉了多余的信息
(图中还有pdb文件,是涛哥单独安装的,用来调试Qt源码,可以忽略)
和bin同级的,还有plugins文件夹,包含一些Qt用到的插件
比如imageformats文件夹中提供了jepg、gif、webp等图片格式的功能支持的插件,platforms文件夹则提供了平台插件,特别是
qwindows.dll这一个,在windows平台是必不可少的。
和bin同级的,另外一个文件夹是’qml’文件夹,包含Qml的各种功能模块。
和bin同级的其它文件夹,resources是WebEngine模块专用的,translations提供了
Qt内置的翻译文件,剩下的和发布无关,就不多说了。
HelloDeploy
这里新建一个简单的Hello World程序,名字就叫”HelloDeploy”。
同时为了说明问题,涛哥添加一些常用的模块。
在pro文件中,QT += 那一行该写的都写上:
在main.cpp中包含一下各个模块的头文件,再分别创建一个对象实例,调用一些简单的函数:
这样一个多模块依赖的程序就写好了。
Window编译和发布
Window 编译
这里要特别注意,编译器的选择, 以及编译用的是debug模式还是release模式。
涛哥这里是msvc2017_x64版本
一般发布用release模式。
编译完成后,默认在build-xxxx-release/release/文件夹中会生成我们的exe程序。
我们将这个exe复制出来,新建一个release文件夹,放进去
这时候可以尝试双击运行它,会提示缺少dll
Window 发布
发布程序,其实就是把exe程序依赖的dll和相关资源都放在一起,保证双击运行即可。
我们前面提过的windeployqt.exe,是Qt提供的命令行工具,能帮助我们自动把需要的dll或资源复制过来。
- 我们先打开一个命令行
可以从开始菜单找到Qt提供的命令行
注意选对版本。这种命令行在启动时已经设置好了QT的环境变量,可以直接输入windeployqt.exe
也可以用普通的命令行,使用windeployqt.exe时带上绝对路径即可。
涛哥一般用普通的命令行,因为绝对路径不易出错。
- cd到release目录
这里说一个windows启动命令行的小技巧:在release文件夹中,按住键盘shift键,然后按鼠标右键,弹出的右键菜单,
会比普通的右键菜单多一个“在此处打开命令窗口”,点击就能在release文件夹打开命令行窗口。
如果没有这个功能,就得手动输入cd指令,进入release路径。
- 执行windeployqt命令
这里通过绝对路径来使用windeployqt:
d:\qt\Online\5.12.4\msvc2017_64\bin\windeployqt.exe HelloDeploy.exe
HelloDeploy这个程序还用到了Qml,用到Qml的程序,要给windeployqt加上qmldir参数,写上相应的msvc2017_64\qml文件夹
(没用到qml的程序,不要加这一步)
d:\qt\Online\5.12.4\msvc2017_64\bin\windeployqt.exe HelloDeploy.exe –qmldir d:\qt\Online\5.12.4\msvc2017_64\qml
写好windeployqt命令后按回车执行
正确执行后,release文件夹下,多了很多dll,以及一些文件夹。
这时候我们双击运行HelloDeploy.exe, 就可以正常启动了。
将整个文件夹压缩或拷贝到其它没有Qt环境的电脑上,也是可以启动的。
只要dll齐备了,制作安装包也不是问题。(后续有时间,我再写安装包制作的教程)
VS运行时库
如果是VS编译的程序,需要将QT路径下对应的vcredist_xxx.exe带上。
如果其它电脑上有vs运行时则可以直接运行,如果没有,就需要运行一下vs运行时安装包。
经常玩一些单机游戏的同学应该都知道这个问题。
有的电脑环境特殊,可能运行时库无法安装上去,这时候需要一些变通的方法,
直接将运行时库安装包里面的dll复制出来即可。
怎么取出来?在能安装的电脑上装一遍,然后就有dll了,名字是vcruntime140.dll、
msvcp140.dll之类的,这里就不展开说了。
常见的错误处理
一般使用windeployqt,大部分库都能自动拷贝,不需要手动处理,
只有极少数情况下,windeployqt跑完,会缺失一些库,还要手动处理一下。
遇到这种情况,用依赖检查工具Dependencies即可快速定位问题。
Dependencies下载链接: https://github.com/lucasg/Dependencies
下面列举一些常见的错误信息
应用程序无法正常启动
最容易出现这种错误的情况是,程序是64位编译出来的,而同级目录下的dll是32位的,
或者同级目录下没有dll,但是环境变量中指向了32位的dll。(所以涛哥没有设置环境变量)
32位和64位倒过来也是。
如果dll版本是匹配的,还有可能出现的情况是缺少第三方库。
这里说一个检查依赖的方法:
将HelloDeploy.exe重命名为HelloDeploy.dll,然后用Dependencies打开,就可以查看少哪些库
如上图,红色问号的表示缺少的库。
找齐了依赖的库,再把程序的扩展名改回exe即可。
启动失败 - no Qt platform plugin
这种情况,是QT路径下的 plugins/platforms/qwindows.dll文件没有复制过来。
注意这个dll文件直接复制到exe同级是不起作用的,要放在exe程序同级的platforms文件夹里,或者同级
的plugins/platforms文件夹里
OpenGL Context 创建失败
这种情况,一般是OpenGL相关的库没有复制过来,补上就好了
整理
我们看到,exe同级目录下,windeployqt将一堆的文件夹放在了那里,有些混乱。
涛哥观察并验证了一下,其实可以做个简单的整理。
Qt开头的文件夹都是qml的模块,剩下的文件夹除了translations都是Qt的插件,
所以新建两个文件夹qml和plugins, 分别把qml模块和插件归入其中。
这样的结构,和QT安装路径下的结构是相似的。
这也正是Qt支持的插件加载路径、qml模块加载路径。
同级的dll则是windows系统默认的动态库加载规则,不方便修改
可以参考msdn:
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
简单裁剪
如果你熟悉Qt的各个模块,可以进行一些裁剪。以下都是些个人经验。
不熟悉请慎重!
不熟悉请慎重!
不熟悉请慎重!
(当然静态编译也是一种裁剪的途径)
删减dll
首先可以把单元测试的dll去掉
Qt5Test.dll
Qt5QuickTest.dll
如果没用到windows扩展,Qt5WinExtras.dll也可以去掉
其次,如果你不需要内置的翻译文件,translations文件夹也可以删掉
删减plugins
再来看一下plugins:
其中platforms是必不可少的,剩下的HelloDeploy都没用到,可以去掉。
常见程序会用的包括:
imageformats 图片格式支持
iconengines 小图标功能
sqldrivers 数据库驱动,这个保留用到的数据库足够了
其他的看情况删减。
删减qml
最后看一下Qml文件夹,如果程序完全没用qml,直接删掉就好了。
按windeployqt给HelloDeploy提供的这些,逐个文件夹来说:
- Qt/labs 一般不推荐Qml中引入labs中的实验品,但是有些情况下功能缺失,只能引入。
如果Qml中使用了Quick.Dialog(不是labs.Dialog),它本身还是依赖的labs中的东西,一般是folderlistmodel和settings,
这时候还是不要动labs了,就按照windeployqt给的放着。
-
Qt/WebSockets Qml的Websocket功能,用了就放着,没用可以删掉。
-
QtGraphicalEffects Qml的一些ShaderEffect特效,用了就放着,没用到可以删掉
-
QtMultimedia Qml的多媒体模块,用了就放着,没用到可以删掉
-
QtQml/Models.2 数据Model, 经常用。
-
QtQuick 这里面大部分都是Qml中常用的,QtQuick/Extras可以按情况删掉
-
QtQuick.2 常用的
-
QtTest 单元测试,删掉吧
-
QtWinExtras Windows扩展,没用到可以去掉
============== End