Windows下MinGW编译静态Qt5 I
2015-09-24 09:07
676 查看
译自http://wiki.qt.io/Building_a_static_Qt_for_Windows_using_MingW。非专业翻译,掺杂个人理解,有删减。
注:仅支持Qt5,Win7或更高版本的系统。
在开发、调试过程采用动态库真真是极好的,因为一切都是现成的,可以直接享用。
然而,如果现在要把程序部署到没有安装Qt的系统中,情况就复杂了——必须把程序调用的DLL一股脑部署过去。就算你祭出经典的DLL Dependency Walker神器,也不一定能分析出程序依赖的所有库文件。(译注:我都是用最笨的方法,反复地尝试,把缺失的dll文件拷贝过去,直到程序能正常工作。如果你有更好的办法,请告诉我)
所以,部署静态版本的应用程序更省事。
而构建应用程序的静态版,需要:Qt动态环境 + Qt静态版本。
下面将介绍如何用Windows PowerShell脚本,自动下载、构建和安装Qt静态开发环境。
注意:Qt4及更早的版本在Windows下构建、安装静态版本存在点问题。而Qt5对Windows下静态编译的支持度更好,本文即是基于Qt5。
本文讲述如何用MinGW编译静态版Qt。如果用MSVC,可以参考下述的大致思路,但操作方法断然是有差别的。
动态版,安装路径C:\Qt
静态版,安装路径C:\Qt\Static。安装方法遵循本文描述的步骤。
动态版用来开发和调试。包括Qt命令行工具,GUI工具如Qt Creator, Assistant, Linguist等。
开发调试完成后,用静态版进行部署。静态版只有命令行工具。至于为什么不构建静态版的GUI工具,理由至少有二:
一是部署应用程序的工作通常都是用脚本自动完成的,不需要GUI工具;
二是构建Qt Creator静态版不很可行,因为插件(plugins)不支持静态环境。
许可问题(略)
静态编译的程序不支持动态模块化方法。 //不支持自定义DLL?。。。
另外还要注意:
静态版的可执行文件比动态版体积大。不过由于动态版要同时部署DLL,所以总的体积来说,静态版更小。
静态版将解除对Qt或MinGW的DLL依赖。但不能解除对Windows DLL的依赖,比如kernel32.dll, user32.dll(略)
安装到默认路径(C:),安装时勾选Tools下面的MinGW选项。
3.0,因此本文的脚本不支持Win7以前的版本。
上述链接从一个小型开源工程QtIMovie的git库直接获取脚本。你可以瞅一眼这个工程,里面包含一些构建脚本示例。
右键单击windows-build-qt-static.ps1,选择“使用PowerShell运行”。
脚本将会执行以下步骤:
下载Qt源代码
用动态版本中的MinGW构建Qt静态版本。构建库和命令行工具(qmake, moc, uic, lupdate, lrelease等)。
默认安装静态版Qt到C:\Qt\Static。
Qt框架复杂,代码量相当大,脚本的执行可能需要若干小时,请耐心等待。
windows-build-qt-static.ps1 [-QtSrcUrl url] [-QtStaticDir directory] [-QtVersion string] [-MingwDir directory] [-NoPause]
指定Qt源文件URL。脚本默认包含最新版本的URL硬编码。
也可以直接修改脚本:
$QtSrcUrl = "http://download.qt-project.org/official_releases/qt/5.5/5.5.0/single/qt-everywhere-opensource-src-5.5.0.7z",
-QtStaticDir directory
指定安装Qt静态环境的根目录。默认为C。
-QtVersion string
指定Qt版本号。默认情况下,脚本会从Qt源文件名称中获取版本号。假如真有辣么一天Qt源文件名的格式变了,你可能得显式指定这个参数值。
-MingwDir directory
指定MinGW环境的根目录。默认使用已安装的Qt中自带的MinGW。
-NoPause
执行结束后不等待用户回车。
注:仅支持Qt5,Win7或更高版本的系统。
WHY
qt.io下载的Qt安装包for windows是动态链接的,安装过程中一并安装了DLL文件。在动态环境下生成的Qt应用程序将动态调用这些DLL文件。在开发、调试过程采用动态库真真是极好的,因为一切都是现成的,可以直接享用。
然而,如果现在要把程序部署到没有安装Qt的系统中,情况就复杂了——必须把程序调用的DLL一股脑部署过去。就算你祭出经典的DLL Dependency Walker神器,也不一定能分析出程序依赖的所有库文件。(译注:我都是用最笨的方法,反复地尝试,把缺失的dll文件拷贝过去,直到程序能正常工作。如果你有更好的办法,请告诉我)
所以,部署静态版本的应用程序更省事。
而构建应用程序的静态版,需要:Qt动态环境 + Qt静态版本。
下面将介绍如何用Windows PowerShell脚本,自动下载、构建和安装Qt静态开发环境。
注意:Qt4及更早的版本在Windows下构建、安装静态版本存在点问题。而Qt5对Windows下静态编译的支持度更好,本文即是基于Qt5。
MinGW vs. MSVC
Qt安装包有MinGW版和Microsoft Visual Studio版,它们互相不兼容、不可混用。择一而用之。本文讲述如何用MinGW编译静态版Qt。如果用MSVC,可以参考下述的大致思路,但操作方法断然是有差别的。
目标环境
要在Windows下开发Qt程序,且后续部署到Windows平台,推荐按以下方式搭建开发环境:动态版,安装路径C:\Qt
静态版,安装路径C:\Qt\Static。安装方法遵循本文描述的步骤。
动态版用来开发和调试。包括Qt命令行工具,GUI工具如Qt Creator, Assistant, Linguist等。
开发调试完成后,用静态版进行部署。静态版只有命令行工具。至于为什么不构建静态版的GUI工具,理由至少有二:
一是部署应用程序的工作通常都是用脚本自动完成的,不需要GUI工具;
二是构建Qt Creator静态版不很可行,因为插件(plugins)不支持静态环境。
限制
静态编译应用程序让部署更简单,但也存在一些限制。记得预先检查是否符合这些限制条件:许可问题(略)
静态编译的程序不支持动态模块化方法。 //不支持自定义DLL?。。。
另外还要注意:
静态版的可执行文件比动态版体积大。不过由于动态版要同时部署DLL,所以总的体积来说,静态版更小。
静态版将解除对Qt或MinGW的DLL依赖。但不能解除对Windows DLL的依赖,比如kernel32.dll, user32.dll(略)
准备工作
1 安装Qt动态版
从qt.io下载"Qt 5.5.0 for Windows 32-bit (MinGW 4.9.2, 959MB)"。你可以选择其他版本,但建议:待编译的源代码版本号=安装包版本号。安装到默认路径(C:),安装时勾选Tools下面的MinGW选项。
2 Windows PowerShell
要求安装PowerShell 3.0或更高的版本。Win8已自带,Win7从微软下载安装(译注:打开后按照页面指引选择版本)。WinXP、Vista不支持PowerShell3.0,因此本文的脚本不支持Win7以前的版本。
3 7-Zip
确保已下载安装7-Zip。构建Qt静态环境
1 下载、运行,搞定
下载并执行脚本windows-build-qt-static.ps1。上述链接从一个小型开源工程QtIMovie的git库直接获取脚本。你可以瞅一眼这个工程,里面包含一些构建脚本示例。
右键单击windows-build-qt-static.ps1,选择“使用PowerShell运行”。
脚本将会执行以下步骤:
下载Qt源代码
用动态版本中的MinGW构建Qt静态版本。构建库和命令行工具(qmake, moc, uic, lupdate, lrelease等)。
默认安装静态版Qt到C:\Qt\Static。
Qt框架复杂,代码量相当大,脚本的执行可能需要若干小时,请耐心等待。
2 命令行运行
除了右键“使用PowerShell运行”,也可以从PowerShell启动windows-build-qt-static.ps1:windows-build-qt-static.ps1 [-QtSrcUrl url] [-QtStaticDir directory] [-QtVersion string] [-MingwDir directory] [-NoPause]
3 命令行参数说明
-QtSrcUrl url指定Qt源文件URL。脚本默认包含最新版本的URL硬编码。
也可以直接修改脚本:
$QtSrcUrl = "http://download.qt-project.org/official_releases/qt/5.5/5.5.0/single/qt-everywhere-opensource-src-5.5.0.7z",
-QtStaticDir directory
指定安装Qt静态环境的根目录。默认为C。
-QtVersion string
指定Qt版本号。默认情况下,脚本会从Qt源文件名称中获取版本号。假如真有辣么一天Qt源文件名的格式变了,你可能得显式指定这个参数值。
-MingwDir directory
指定MinGW环境的根目录。默认使用已安装的Qt中自带的MinGW。
-NoPause
执行结束后不等待用户回车。
相关文章推荐
- Qt信号与槽机制
- Linux系统下的OpenCV编译以及OpenCV的Qt上的使用
- OpenGL QT glViewport 函数的作用
- QT 笔记
- 基于Apollo代理服务器的MQTT推送平台搭建
- MQTT
- Qt 命令行编译
- Qt 对象树 <一>
- QT显示图片 .转
- Qt后台窗口
- Qt信号-槽源码解析(一)
- 【Qt】窗体间传递数据(跨控件跨类),三种情况与处理方法
- QT5.2.1大BUG
- Qt数据库之数据库连接池-转自网络
- QTableView的一些用法
- Qt信号-槽源码解析(二)
- Qt环境配置相关问题
- [置顶] Qt实现等待提示框(图片和movie实现)
- qt 与mysql建立交互式连接
- Qt 与 xcode 7版本的问题