在去年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. radio选择事件 onchange事件 onclick事件

    单选框按钮(radio)选择事件怎么设置呢? 既可以在radio标签里设置onclick事件实现,也可以设置它的onchange事件实现,效果一样,代码如下: <input id="r ...

  2. 一起学Python:字典介绍

    字典介绍 想一想: 如果有列表 nameList = ['xiaoZhang', 'xiaoWang', 'xiaoLi']; 需要对"xiaoWang"这个名字写错了,通过代码修 ...

  3. Springboot系列:@SpringBootApplication注解

    在使用 Springboot 框架进行开发的时候,通常我们会在 main 函数上添加 @SpringBootApplication 注解,今天为大家解析一下 @SpringBootApplicatio ...

  4. 微信小程序开发demo-地图定位

    要求要完成的功能: 1.要完成的要点是城市定位. 2.就是切换城市. 首页我们先参照微信小程序开放的官方文档找到: 在这里我们可以找到”当前位置经纬度“ getLocation: function ( ...

  5. webcollector + selenium 爬取空间相册图片

    package cn.hb.util; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWr ...

  6. spring quartz使用多线程并发“陷阱”

    定义一个job:ranJob,设置每秒执行一次,设置不允许覆盖并发执行 <bean id="rankJob" class="com.chinacache.www.l ...

  7. 解决用户绕过Servlet直接访问jsp页面

    解决用户绕过ActionServlet,直接访问jsp文件的问题 1.将所有jsp文件拷贝到WEB-INF目录下 因为WEB-INF目录中的内容不能直接访问,但能转发过来 项目结构图如下: 2.修改s ...

  8. 在sql语句中 inner join ,left join,right join 和on 以及where

    当使用几种join的时候,on是指表连接起来基于的条件,where是对连接的表进行过滤的条件. where 1=1  当我们需要拼接字符串的时候 在基础sql字符串中写上where 1=1 可以不需要 ...

  9. 新建py文件时取名千万要小心 不要和已有模块重名

    这是因为我新建了一个email.py的文件 后来我将文件名rename成了myemail.py没有看改名提示,结果导致所有的对email的import和调用全部改成了对myemail的import和调 ...

  10. 数据科学(data science)概览

    0. 硬件平台设计 一种分层的体系结构: 自下到上依次是: 硬件层 分布式系统层 分布式管理层 分布式处理层 应用层: 1. 总论