在去年4月份的时候,我写过一篇动态编译Qt5.6.0的文章,当时是为了解决webkit不能在winxp下面跑的问题,动态编译有一个缺点,就是发布的时候,要携带一大堆dll,使安装包的体积增大。而静态编译能够解决这个问题,但是静态编译也有缺点,那就是编译时间很长,而且每次不管哪个模块有改动,就必须重新编译链接整个项目。现在Qt最新版本已经到5.8.0RC了,但5.6.2应该是最后一个支持xp的版本了,5.7.0源码里configure已经去掉了-target xp这个选项。

注意:闭源项目链接静态Qt库并发布软件是违反LGPL协议的,请遵守此协议,否则因此造成的任何后果,与本文作者无关。

一、准备

需要的工具和上篇文章里面列出来的差不多,除了下面几个

1、qt-everywhere-opensource-src-5.6.2源码

2、Precompiled ICU已经静态编译好的icu,注意下载vs2013版本的,我下载的是icu-58.2-vs2013.7z

3、win_flex_bison,编译webkit需要

二、获取webkit源码

先解压5.6.2的源码到C:\Qt\qt-everywhere-opensource-src-5.6.2,打开CMD转到此目录,输入Git clone git://code.qt.io/qt/qtwebkit.git下载源码,由于是国外地址,请留意上篇文章的提示。下载完成之后,再执行:git checkout 5.6.2,注意checkout这一步是必须的,每个Qt版本都有对应的webkit版本,不执行这一步下载的webkit源码应该是当前的最新版本5.8.0RC对应的源码,编译很可能会出问题。

三、编译openssl

编译过程和上篇文章大致相同,不过静态编译的时候要用ms/nt.mak,而不是ms/ntdll.mak,另外安装目录(-prefix),我这里是:C:\Qt\openssl-static,其他操作参考上篇文章即可。

四、编译Qt5.6.2

打开VS2013的x86命令提示工具,执行以下命令(确保Python,ruby,perl,jom已经添加到了PATH):

  1. SET ICU_DATA=C:\Qt\icu-58.2-vs2013\data
  2. SET PATH=C:\Qt\icu-58.2-vs2013\bin;C:\Qt\icu-58.2-vs2013\lib;C:\Qt\win_flex_bison-latest;C:\Qt\qt-everywhere-opensource-src-5.6.2\qtbase\bin;C:\Qt\qt-everywhere-opensource-src-5.6.2\gnuwin32\bin;%PATH%

然后创建C:\Qt\build-Qt5.6.2-msvc2013-static-x86-debug和C:\Qt\build-Qt5.6.2-msvc2013-static-x86-release两个目录,用于分别编译debug和release两个版本,再创建C:\Qt\Qt5.6.2-msvc2013-static-x86目录,作为Qt的安装目录

修改C:\Qt\qt-everywhere-opensource-src-5.6.0\qtbase\mkspecs\common\msvc-desktop.conf的74行和75行为:/SUBSYSTEM:CONSOLE\",5.01\"
和 /SUBSYSTEM:WINDOWS\",5.01\"

修改C:\Qt\qt-everywhere-opensource-src-5.6.2\qtwebkit\Source\WebCore\platform\qt\QtTestSupport.h的28行和30行:

  1. #if defined(BUILDING_WEBKIT)
  2. #define TESTSUPPORT_EXPORT //Q_DECL_EXPORT
  3. #else
  4. #define TESTSUPPORT_EXPORT //Q_DECL_IMPORT
  5. #endif

把Q_DECL_EXPORT和Q_DECL_IMPORT注释掉,这个是导出DLL用的,静态编译没有这个东西。

注意:编译webkit只能用VS2013,否则webkit不会被编译:参考C:\Qt\qt-everywhere-opensource-src-5.6.2\qtwebkit\Tools\qmake\mkspecs\features\configure.prf文件第132行:

如果你的编译器不是VS2013,webkit构建的时候会自动跳过。。这也是一个坑,笔者之前用VS2015去编译,就发现了这个问题。

编译debug版本

转到C:\Qt\build-Qt5.6.2-msvc2013-static-x86-debug

执行:"../qt-everywhere-opensource-src-5.6.2/configure.bat"
-prefix C:/Qt/Qt5.6.2-msvc2013-static-x86 -debug -platform win32-msvc2013 -opensource -static -static-runtime -nomake examples -nomake tests -skip qtwebengine -skip qtwebview -accessibility -plugin-sql-odbc -plugin-sql-sqlite -opengl desktop -target xp -largefile
-qt-zlib -qt-pcre -icu -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -rtti -ssl -openssl-linked -mp -I C:\Qt\openssl-static\include -I C:\Qt\icu-58.2-vs2013\include -L C:\Qt\openssl-static\lib -L C:\Qt\icu-58.2-vs2013\lib -l gdi32 -D _USING_V110_SDK71_
-D U_STATIC_IMPLEMENTATION

输入y接受协议,等待配置完成

执行:jom或者nmake

编译完成后,如果没有出现错误,执行,nmake install

编译release版本

转到 C:\Qt\build-Qt5.6.2-msvc2013-static-x86-release

执行:"../qt-everywhere-opensource-src-5.6.2/configure.bat" -prefix C:/Qt/Qt5.6.2-msvc2013-static-x86 -release -platform win32-msvc2013 -opensource -static -static-runtime -ltcg -nomake examples
-nomake tests -skip qtwebengine -skip qtwebview -accessibility -plugin-sql-odbc -plugin-sql-sqlite -opengl desktop -target xp -largefile -qt-zlib -qt-pcre -icu -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -rtti -ssl -openssl-linked -mp -I C:\Qt\openssl-static\include
-I C:\Qt\icu-58.2-vs2013\include -L C:\Qt\openssl-static\lib -L C:\Qt\icu-58.2-vs2013\lib -l gdi32 -D _USING_V110_SDK71_ -D U_STATIC_IMPLEMENTATION

输入y接受协议,等待配置完成

执行:jom或者nmake

编译完成后,如果没有出现错误,执行,nmake install

注意:

1、configure.bat执行之后,可能会出现一堆警告:

C:\Qt\build-Qt5.6.2-msvc2013-static-x86-debug/qtbase/mkspecs/qconfig.pri:22:
Extra characters after test expression.

...

原因是Qt的构建脚本有问题,编辑C:\Qt\build-Qt5.6.2-msvc2013-static-x86-debug/qtbase/mkspecs/qconfig.pri

Qt的构建脚本,在获取cl编译器的版本号时,字符串截取有问题,手动编辑一下,改成下面这样即可:

2、nmake install之后,C:\Qt\build-Qt5.6.2-msvc2013-static-x86-debug和C:\Qt\build-Qt5.6.2-msvc2013-static-x86-release两个构建目录不能删除

因为之后编译项目的时候,会链接到一些lib,比如webkit1.lib,这些lib,install的时候并没有安装到C:\Qt\Qt5.6.2-msvc2013-static-x86\lib

看到这里有人肯定会问为什么不一起编译debug和release,其实是可以的,直接把release版本的configure命令-release改为-debug-and-release即可。

五、测试运行

用QtCreator新建一个项目,创建一个QWebView,然后加载http://www.baidu.com/

  1. CONFIG(release, debug|release): QMAKE_LFLAGS  += /LTCG
  2. QMAKE_LFLAGS  += /IGNORE:4099
  3. QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE\",5.01\"
  4. QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS\",5.01\"
  5. DEFINES += _USING_V110_SDK71_
  6. DEFINES += U_STATIC_IMPLEMENTATION

注意在pro里面增加上面的代码,/IGNORE:4099表示忽略没有找到pdb的警告,因为这个预编译好的icu是没有自带pdb的,如果不加这一项,编译的时候会出现很多没有找到pdb的警告。我们通常也不会去调试icu的代码,所以忽略这个警告对我们没有什么影响。

U_STATIC_IMPLEMENTATION这个宏是静态链接icu要使用的,请参考icu的帮助文档

项目构建之后,生成的exe有54M!下图是运行结果,笔者在xp系统上也测试过,能正常运行。

http://blog.csdn.net/kenier/article/details/54598698

Qt 5.6.2 静态编译(VS2013 x86 target xp openssl icu webkit)的更多相关文章

  1. Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)

    经历了多次延期后,在3月16号,Qt发布了5.6.0版本(全面支持高DPI无疑是一个亮点),从5.6.0版本开始,Qt直接移除了webkit模块,让webengine作为其替代选择,不过webengi ...

  2. VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布(好像很不错,有六张插图说明)good

    为什么要在VS2008中使用QT静态编译呢?很简单,因为VS2008编译器编译出来的文件比mingw编译的要几乎小一半. 好了现在我们来做些准备工作,VS2008自然要安装的,然后打上SP1的补丁.然 ...

  3. VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布(很不错,有六张插图说明,修改qmake.conf里的MD参数等)good

    为什么要在VS2008中使用QT静态编译呢?很简单,因为VS2008编译器编译出来的文件比mingw编译的要几乎小一半. 好了现在我们来做些准备工作,VS2008自然要安装的,然后打上SP1的补丁.然 ...

  4. Qt 4.6.2静态编译后,创建工程出现中文乱码的解决办法

    一.如果静态编译是用mingw编译的 1)在pro文件里增加QTPLUGIN += qcncodecs 2)在main函数所在的文件里面增加#include <QtPlugin>和Q_IM ...

  5. 静态编译 Qt5.7.0 (含 openssl 支持)

    关于Qt静态便宜的环境等,请先参见 Win10 + VS2015 下编译 Qt5.6.0 . 首先编译 openssl .我这里用的版本是 openssl 1.0.2j (新的1.1版本的便宜稍有不同 ...

  6. Qt 4.6.2静态编译

    一.下载mingw 4.4.0:ftp://ftp.trolltech.com/misc/MinGW-gcc440_1.zip 二.解压到C:\mingw目录下,设置环境变量path将C:\mingw ...

  7. Qt最新版5.12.2在Win10环境静态编译安装和部署的完整过程(VS2017)

    一.为什么要静态编译 用QtCreator编译程序时,使用的是动态编译.编译好的程序在运行时需要另外加上相应的Qt库文件,一大堆dll文件.如果想将生成的程序连同所需要的库一起完整地打包成一个可执行程 ...

  8. C++ Qt 框架静态编译 操作记录

    谁愿意写个程式出来之后还附带一堆DLL,尤其是名字如此明显的名字. 于是在网上看了看,是需要下载源代码然后进行编译的,但是看了看别人说的编译时间,长达几个小时,瞬间就感觉不想做了.因为我还需要抓紧时间 ...

  9. Linux下静态编译Qt

    Qt采用编译的方式安装的时候,配置中默认的编译方式是动态编译的,但是有时候你编写的程序要发布出去,带很多动态库文件是很繁琐的,此时就需要静态编译你的程序,Qt要实现静态编译必须库文件也是静态编译的,所 ...

随机推荐

  1. 【LCA最近公共祖先】在线离线

    [在线] 1.倍增法 现将深度较大的跳至与深度较小的统一深度.预处理$fa[u][i]$表示$u$往上跳$2^i$个单位后的祖先,则就可以像快速幂一样,将移动的步数化为二进制,如果第$i$位为$1$, ...

  2. Java Service Wrapper 使用(windows)

    1       简介 最近项目中需要做一个Windows系统服务,记录一下使用过程. Java Service Wrapper 可以将Java程序包装成系统服务,这样就可以随着系统的运行而自动运行.J ...

  3. Java中的集合Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap(五)

    Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的ke ...

  4. VSCode 小鸡汤 第01期 - REST Client 简单好用的接口测试辅助工具

    介绍 今天给大家介绍一个后端开发辅助的好工具 -- REST Client,插件如其名这就是一个 REST 的客户端插件,把我们的 VSCode 转化为一个 REST 接口测试的利器 我们一般都会用 ...

  5. Delphi Bpl包学习

    对于BPL包,我个人理解是:就是一种封装方式,和DLL,EXE类似,把代码放到包(package)里面保存而已. 一.先说说如何创建BPL包 1.   打开delphi IDE(delphi7 为例) ...

  6. numpy 辨异(二) —— np.identity()/np.eye()

    import numpy as np; 两者在创建单位矩阵上,并无区别,两者的区别主要在接口上: np.identity(n, dtype=None):只能获取方阵,也即标准意义的单位阵: np.ey ...

  7. WPF中利用RadialGradient模拟放大镜效果

    原文:WPF中利用RadialGradient模拟放大镜效果 --------------------------------------------------------------------- ...

  8. Mac版Visual Studio预览版

    来了,Mac版Visual Studio预览版开放下载 投递人 itwriter 发布于 2016-11-17 12:11 评论(7) 有1317人阅读 原文链接 [收藏] « » 微软前俩天宣布,推 ...

  9. 神户制钢坑了500家企业 百年老店为何走上邪路?(企业经营再艰难,也不能降低产品质量,甚至偷工减料,同样适用于IT行业)

    神户制钢这颗烂萝卜,拔出它之后带出的泥越来越多.上周五社长川崎博也又开了记者会,再次道歉,而受到其数据造假影响的客户数量也从200家飙升到500家. 日本政府给神户制钢两周时间调查,还要在一个月内公布 ...

  10. 微信小程序支付结果 c#后台回调

    又为大家带来简单的c#后台支付结果回调方法,首先还是要去微信官网下载模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在打开WxPayAPI项目中的example文件下的 Nat ...