最近领导给一个任务:编译一个Qt环境,从而让Qt程序“摆脱”显式VS运行时库。因为Qt Creator 默认的都是动态编译,所以为了完成任务,必须要自己手动静态编译Qt源码。因为我们的目标是使用MSVC并且要兼容Windows XP 系统,所以即使网上的教程很多,但是符合我们需求的教程也比较少,而且由于自己很小白,一些大佬的“高大上”的教程着实有点吃不消,为此花了N天,不断的实验、踩坑、实验、踩坑…终于“修成正果”,特在此留迹,希望能够给需要的伙伴们一点帮助,也给自己留一笔记。
实验环境
- 操作系统:Windows 10
- Visual Studio:2015
- Qt Creator:v4.0.3
- Qt 源码版本:v5.6.3
- Python:v3.6.4
- Perl:v5.24.3
- jom:v1.1.3
环境配置
-
Qt 源码下载
安装Qt时默认的是使用动态库, Qt 官网 也没有提供编译好的静态库供人们下载。不过不乏一些网络大佬已经给我们静态编译好了部分版本的Qt,如 https://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/ 。但是我下载了其中几个的版本,经过试验发现并不能满足我的需求,因此,只好自行下载相应的Qt源码,自己动手生成静态库。
这里我选择的是 Qt 5.6.3,源码网址:http://download.qt.io/official_releases/qt/5.6/5.6.3/ ,(需要其他版本源码的伙伴们可以在 http://download.qt.io/official_releases/qt 里面下载),因为我之前已经有了 Qt Creator 编译器,所以 我只选择了下载 Qt 源码(如果没有编译环境的伙伴可以选择下载 .exe 程序, 在安装的时候一定要勾选 Source Components 选项)。
-
Python 环境配置
因为人工智能的又一次兴起,Python 再次成为热点,因此网络中有很多优秀的Python环境变量配置教程,没有安装Python的伙伴可以自行在网上寻找相关教程,如果不想再麻烦,在此我提供了一个自认为还不错的网址:https://www.cnblogs.com/huangbiquan/p/7784533.html ,这是以 python 2.7.8(64位)为例的,python 3 的过程类似。
-
Perl 环境配置
其实我觉得 Perl 在我的编译过程中并没有什么作用,但是网络中的大多数都要求配置 Perl 环境,所以我也跟着配了一下。(反正也不是特麻烦,哈哈~)
安装包:Windows Installer (MSI)
官网地址:ActivePerl Downloads - Perl Binaries for Windows, Linux and Mac我选择的是 ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe。友情提示:在安装过程记得勾选 添加到 Path中,否则还请自行配置其环境变量。
-
jom 下载
jom是nmake的一个克隆,支持并行执行多个独立命令。在编译阶段为了使用多核处理器从而提高编译速度,可以采用jom 方式,因为编译时间比较长,期间如果还想使用电脑,建议使用单线程的 nmake。
jom 安装比较简单,官方介绍:https://wiki.qt.io/Jom ,其中有下载网址,本人选择的是最新版的 jom_1_1_3.zip ,直接解压即可使用。
Qt 源码编译
-
修改编译文件
将下载的Qt源码进行解压后,寻找 ./qt-everywhere-opensource-src-5.6.3/qtbase/mkspecs/common 目录下的
msvc-desktop.conf 文件,打开。找到以下代码:QMAKE_CFLAGS_RELEASE = -O2 -MD QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi QMAKE_CFLAGS_DEBUG = -Zi -MDd
将其修改为以下形式:
QMAKE_CFLAGS_RELEASE = -O2 -MT QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi QMAKE_CFLAGS_DEBUG = -Zi -MTd
-
打开VS2015 开发人员命令提示
打开开始菜单,找到 Visual Studio 2015 文件夹,找到 “Developer Command Prompt for VS2015”,即:VS2015 开发人员命令提示
打开后进入到Qt源码文件夹下,如我的源码在 E:\Qt\Src\qt-everywhere-opensource-src-5.6.3 下
下面重点来了!!!
configure -confirm-license -opensource -platform win32-msvc2015 -debug-and-release -static -mp -target XP -prefix “E:\Qt\5.6.3-static-vs2015” -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples
configure 参数详解:
在 configure.exe所在的文件目录下,使用 " configure -h" 命令可以查看所有参数,这里只介绍用到的比较多的几个参数:
-confirm-license -opensource: 自动选择开源协议
-platform: 选择编译平台
-debug-and-release: debug和release编译 (默认只编译 release版本)
-static: 编译静态库
-mp: 多线程编译 (需配合 jom 使用)
-target: 选择目标平台
-prefix: 指定编译后生成的目录 (其中的引号必须是英文哦)
-qt-sqlite -qt-pcre -qt-zlib -qt-libpng...: 这些的意思是使用Qt源码中自带的这些第三方库
-nomake examples -nomake tests: 不编译example和tests
该过程大概需要几分钟的样子,如果过程中没报错,则配置完成,可以根据系统提示,继续执行 “nmake”,如果想用多线程,可以选择 “jom”。
-
使用 nmake 编译源码
直接在控制命令行窗口输入:nmake,该过程大概需要3~4小时,根据电脑配置不同,时间略有出入。如果选择输入:jom,那么该过程大概需要 0.5~1小时(因为是多线程编译,所以期间电脑会很卡,如编译期间仍需用电脑,建议使用 nmake)。
-
使用 nmake install 安装源码
步骤4 执行完后,直接输入:nmake install 或者 jom install。前者对应 nmake,后者对应*jom*。此过程的执行时间也比较长,前者大概0.5~1小时,后者大概1小时(很无聊,但是请耐心等待)
以上步骤执行完成后就可以在你的目标生成目录中找到你梦寐以求的静态版Qt了。下面要开始在Qt Creator 或者 vs2015 部署了~~~
静态Qt库部署
-
在 Qt Creator 中使用 Qt 静态库
在 Qt Creator 中部署比较简单,点击菜单“工具”-“选项”,再选择“构建和运行”-“Qt Versions”-“添加”,将刚才静态库目录下的 .\bin\qamke.exe 加进来,点击 “Apply(应用)”。
在 选择 “构建套件(Kit)”–“添加”,“Qt 版本”选择我们上面设置好的静态版Qt。然后给该套件起个名称,以增加可读性。最后点击 “OK”。配置完成。
注: 在 Qt Creator 中使用静态Qt时,需要在项目文件 .pro 中添加 “CONFIG += static”。
在vs中配置过程比较复杂,首先需要更换静态 Qt 库,然后进行项目配置,最后在 main 函数中导入平台扩展静态库的头文件。下面一一介绍:
-
安装 Qt Visual Studio Tools 或 QtPackage 工具
本文以 Qt VS Tools 为例。在 “工具”-“扩展与更新”中在线搜索 “Qt Visual Studio Tools”,下载后,关闭所有 Visual Studio 窗口,该工具会自动安装。安装完成如下:(如有该工具或者QtPackage,本步骤直接跳过即可)
-
更换静态 Qt 库
在 Qt VS Tools 中依次打开 “Qt Options”-“Qt Versions”,选择 “添加”,然后在 path 选项中打开 编译好的Qt静态库(目录打开到 bin 目录的父目录即可,例:E:\Qt\5.6.3-static-vs2015),然后给其命名一个易识别的名称(也可以使用默认名),注意 在下面的 默认Qt/Win 版本中选中该静态版本。点击 “OK” 即可。
-
项目配置
上面扩展给我们提供了使用动态Qt库模板,但是要使用静态库,还需一下配置:
首先,在项目上右键,选择 “属性”-“链接器”-“常规”-“附加库目录”-添加 “$(QTDIR)\plugins\platforms” 这个目录,即平台扩展静态库。
然后在“链接器”-“输入”-“附加依赖项”,新增下面这些库:
release 版:
Qt5PlatformSupport.lib
qminimal.lib
qoffscreen.lib
qwindows.lib
qtfreetype.lib
qtharfbuzzng.lib
qtpcre.lib
opengl32.lib
ws2_32.lib
debug 版:
Qt5PlatformSupportd.lib
qminimald.lib
qoffscreend.lib
qwindowsd.lib
qtfreetyped.lib
qtharfbuzzngd.lib
qtpcred.lib
imm32.lib
winmm.lib
opengl32.lib
ws2_32.lib
在 “C/C++” -“常规”-“附加包含目录”,加入下面4个路径:
$(QTDIR)\include\QtCore
$(QTDIR)\include\QtGui
$(QTDIR)\include\QtWidgets
$(QTDIR)\include\QtPlatformSupport
修改程序的运行时库,release 版选择 /MT,debug 版 选择 /MTD。如下图:
注: 以上配置中的所有 $(QTDIR) 变量代表的是 静态编译好的Qt源码地址。如需修改可以在项目目录下查找 .pro.user 文件,然后修改文件里面的 $(QTDIR)变量定义。
-
导入平台扩展静态库的头文件
在项目中找到main.cpp这个文件,在开头插入下面的代码,即可导入平台扩展静态库的头文件
#include <QtCore\QtPlugin> Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
以上步骤完成后,静态Qt库在vs中的配置就宣告结束了,伙伴们就可以愉快的使用静态库编写程序,而不需要一大堆的dll了。
参考链接: