在去年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. spring sts4 如何添加tomcat 服务

    spring sts4 ide中已经没有集成tomcat运行服务器了,需要到点击Help-->Eclipse Marketplace中安装 Eclipse JST Server Adapters ...

  3. jquery 源码学习(二)

    在网上找到一篇广为流传的文章<常用正则表达式>,逐一分析,不足地方进行补充和纠正   作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail ...

  4. Vue.JS学习基础

      = 导航   顶部 vue.js介绍 vue.js实例 模板语法 计算属性 样式绑定 条件渲染 列表渲染 事件处理器 表单控件绑定 组件   顶部 vue.js介绍 vue.js实例 模板语法 计 ...

  5. windows 7 64位下配置mysql64位免安装版

    1.官方网站下载mysql-noinstall-5.1.51-winx64.zip 2.解压到E:\Program Files\MySQL.(路径自己指定) 3.在E:\Program Files\M ...

  6. 自己动手编写一个VS插件(六)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在上篇中我们已经实现了创建和显示一个工具栏出来,它的效果图是这样的: 现在我们实现一些简单功能,具体就是单击按钮弹出一 ...

  7. javascript 次序li

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. 三星260亿美元的豪赌:想垄断DRAM和NAND闪存市场(规模经济让对手难以招架)

    腾讯科技讯 据外媒报道,经过50年的发展,半导体市场仍然显得非常活跃,它在今年有望增长20%.随着高增长而来的是供应短缺,这就是DRAM和闪存价格为什么今年会上涨的原因. 三星在DRAM和闪存市场占有 ...

  9. 怎样将数据库MySQL 迁移到 MariaDB 上

    自从甲骨文收购 MySQL 后,由于甲骨文对 MySQL 的开发和维护更多倾向于闭门的立场,很多 MySQL 的开发者和用户放弃了它.在社区驱动下,促使更多人移到 MySQL 的另一个叫 MariaD ...

  10. Git撤销对远程仓库的push&commit提交

    撤销push 1. 执行  git log查看日志,获取需要回退的版本号 2. 执行 git reset –soft <版本号> ,如 git reset -soft 4f5e9a90ed ...