说明

qt 5.6的编译进行了数十遍,才得出本文的可行方案,之所以花了这么多的时间,主要是qt引入了QtWebEngine模块后,导致编译难度直线上升,而且又有一些中国特色的问题(如360安全卫士)导致,希望本文可以为大家节省更多的时间

  • 为什么要自己编?

    • 因为qt的预编译发行包中,QtWebEngine模块的QtWebEngineProcess.exe不能在xp下运行,是因为他们编译的时候没用支持xp的工具集导致的

源码下载

  • Qt git地址:git://code.qt.io/qt/qt5.git
  • 推荐用 SourceTree 客户端来克隆源码

准备工作

  • 系统 Windows 7 或者 Windows 10
  • 编译器 Visual Studio 2013 Update 5 或者 Visual Studio 2015 Update 1
  • 本文在以下4种情况下都编译通过
    • Windows 7 + Visual Studio 2013 Update 5
    • Windows 7 + Visual Studio 2015 Update 1
    • Windows 10 + Visual Studio 2013 Update 5
    • Windows 10 + Visual Studio 2015 Update 1
  • 安装Git,编译过程可能会启动 git.exe
  • 安装ActivePerl
  • 安装Python
  • 编译ICU库
  • 编译openssl
  • 编译webkit需要的环境
  • 最重要的准备工作
    • 保持编译过程中联网
    • 关闭360等安全卫士,杀毒软件,编译过程中360会弹框拦截
    • 将系统的区域改成 英语(美国),否则编译QtWebEngine会失败,如图所示

可能遇到的编译错误

  • 使用 vs2013 编译的时候,有可能会遇到以下错误

    1
    Error 2 error C2440: 'default argument' : cannot convert from 'const wchar_t [1]' to 'const BSTR'   (src\GAudioOutput.cc) C:\Program Files (x86)\Windows Kits\8.1\Include\um\sapi.h 16917 1 qgroundcontrol

    遇到这个问题,需要修改 qtbase\mkspecs\common\msvc-base.conf 文件,将下面这段删除,如图

  • 使用 VS2015 Update2/Update3 编译时遇到以下错误

    1
    2
    ...\skedge.cpp(231): error C2220: warning treated as error - no 'object' file generated
    ...\skedge.cpp(231): warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)

    解决办法:使用5.6.1或者5.7.0版本的qt

    参考链接:QtWebEngine does not build with VS2015 SP2

编译

  • 新建一个 environment.bat,用来执行环境变量的设置,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    @echo off
    
    rem 设置vs安装路径
    set MSVC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 14.0 rem 设置icu源码路径,在编译icu时用到,编译qt用不到源码
    set ICU_SRC_PATH=C:\Users\king\Documents\Workspace\Qt\build\icu-source\source rem 设置icu编译安装的路径,在编译icu时用到,编译qt用不到这个格式的路径,注意安装路径格式,是linux风格
    set ICU_INSTALL_PATH=/cygdrive/C/Users/king/Documents/Workspace/Qt/build/icu rem 设置CYG依赖,在编译icu时用到,编译qt用不到
    set CYG_WIN_PATH=C:\Users\king\Documents\dev\cygwin64\bin rem 设置ICU编译安装的路径,编译Qt会用到,注意格式,是Windows风格
    set ICU_INSTALL_PATH_WIN=C:\Users\king\Documents\Workspace\Qt\build\icu rem 设置openssl源码路径,在编译openssl时用到,编译qt用不到源码
    set OPENSSL_SRC_PATH=C:\Users\king\Documents\Workspace\Qt\build\openssl-1.0.1p rem 设置openssl的最终安装路径,编译qt时会用到
    set OPENSSL_INSTALL_PATH=C:\Users\king\Documents\Workspace\Qt\build\openssl rem 设置编译Qt的编译器配置文件名
    set QMAKESPEC=win32-msvc2015 rem 设置qt的源码路径
    set QT5_SRC_PATH=C:\Users\king\Documents\Workspace\Qt\qt5 rem 设置qt编译后的安装路径
    set QT5_INSTALL_PATH=C:\Users\king\Documents\Workspace\Qt\qt_5.6.0 rem 设置git安装路径
    set GIT_PATH=C:\Program Files\Git rem 设置Perl的bin路径
    set PERL_PATH=C:\Users\king\Documents\dev\Perl\bin rem 设置python安装路径
    set PYTHON_PATH=C:\Program Files (x86)\Python27 rem qtwebkit依赖环境
    set WIN_FLEX_BISION_PATH=D:\Dev\win_flex_bison-latest
    set SQLITE3SRCDIR=D:\Dev\sqlite-amalgamation-3110100
    set RUBY_PATH=D:\Dev\Ruby22\bin rem 执行MSVC环境设置
    call "%MSVC_PATH%\VC\vcvarsall.bat" x86
  • 新建一个 build_qt.bat,用来执行qt的编译,代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    @echo off
    
    rem 调用前一个bat,执行环境变量的设置
    call environment.bat rem 将qt相关的路径加入path变量,为什么qtbase\lib也加进去,因为编译过程中会执行qt自己编出来的exe,会依赖qt相关的dll,所以也加进去,git路径也加进来,保证编译过程中可以找到git.exe
    set PATH=%QT5_SRC_PATH%\qtbase\bin;%QT5_SRC_PATH%\qtbase\lib;%QT5_SRC_PATH%\gnuwin32\bin;%GIT_PATH%\bin;%PATH% rem 将qtrepotools\bin路径加入path环境变量
    set PATH=%QT5_SRC_PATH%\qtrepotools\bin;%PATH% rem 将perl,python加入path
    set PATH=%PATH%;%PERL_PATH%;%PYTHON_PATH% rem 设置icu和openssl库的引用路径
    set LIB=%LIB%;%ICU_INSTALL_PATH_WIN%\lib;%OPENSSL_INSTALL_PATH%\lib rem 设置icu和openssl库的头文件引用路径
    set INCLUDE=%INCLUDE%;%ICU_INSTALL_PATH_WIN%\include;%OPENSSL_INSTALL_PATH%\include rem 将icu和openssl的bin目录加入PATH环境变量,icu的lib路径也加入PATH,是因为编译过程中运行的一些exe依赖icu库的dll
    set PATH=%PATH%;%ICU_INSTALL_PATH_WIN%\bin;%OPENSSL_INSTALL_PATH%\bin;%ICU_INSTALL_PATH_WIN%\lib rem 进入qt源码目录
    cd /D %QT5_SRC_PATH% rem 配置qt,-target xp是支持xp系统,不然编出来的exe在xp下不能运行,比如QtWebEngineProcess.exe
    rem 可选参数 -force-debug-info:release版本也生成PDB文件
    call %QT5_SRC_PATH%\configure -prefix %QT5_INSTALL_PATH% -debug-and-release -opensource -confirm-license -opengl dynamic -mp -icu -openssl -nomake examples -nomake tests -target xp -skip qtwebkit -no-directwrite rem 执行编译
    nmake rem 执行安装
    nmake install rem 复制openssl和icu到qt安装目录中
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\icudt56.dll" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\icuin56.dll" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\icuuc56.dll" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\icudt.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\icuin.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\icuuc.lib" "%QT5_INSTALL_PATH%\lib\" xcopy /y /k "%OPENSSL_INSTALL_PATH%\bin\libeay32.dll" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%OPENSSL_INSTALL_PATH%\bin\ssleay32.dll" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%OPENSSL_INSTALL_PATH%\lib\libeay32.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%OPENSSL_INSTALL_PATH%\lib\ssleay32.lib" "%QT5_INSTALL_PATH%\lib\" pause
  • 双击执行 build_qt.bat,整个编译过程可能需要4、5个小时,如果按照本文从头一步一步下来,应该可以一遍就编成功

  • 新建一个 build_qtwebkit.bat,用来执行qtwebkit的编译,代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @echo off
    
    call environment.bat
    
    set LIB=%LIB%;%ICU_INSTALL_PATH_WIN%\lib;%OPENSSL_INSTALL_PATH%\lib;%QT5_INSTALL_PATH%\lib
    set INCLUDE=%INCLUDE%;%ICU_INSTALL_PATH_WIN%\include;%OPENSSL_INSTALL_PATH%\include;%QT5_INSTALL_PATH%\include
    set PATH=%QT5_INSTALL_PATH%\bin;%WIN_FLEX_BISION_PATH%;%ICU_INSTALL_PATH_WIN%\bin;%OPENSSL_INSTALL_PATH%\bin;%ICU_INSTALL_PATH_WIN%\lib;%QT5_SRC_PATH%\gnuwin32\bin;%PERL_PATH%;%PYTHON_PATH%;%RUBY_PATH%;%PATH% cd /D %QT5_SRC_PATH% %PERL_PATH%\perl %QT5_SRC_PATH%\qtwebkit\Tools\Scripts\build-webkit --qt pause
  • 如果要重新编译,需要清除之前编译的临时文件,可以新建一个 clean_qt.bat 来执行清理工作,代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @echo off
    
    rem 调用前一个bat,执行环境变量的设置
    call environment.bat rem 将qt相关的路径加入path变量,为什么qtbase\lib也加进去,因为编译过程中会执行qt自己编出来的exe,会依赖qt相关的dll,所以也加进去,git路径也加进来,保证编译过程中可以找到git.exe
    set PATH=%QT5_SRC_PATH%\qtbase\bin;%QT5_SRC_PATH%\qtbase\lib;%QT5_SRC_PATH%\gnuwin32\bin;%GIT_PATH%\bin;%PATH% rem 将qtrepotools\bin路径加入path环境变量
    set PATH=%QT5_SRC_PATH%\qtrepotools\bin;%PATH% rem 将perl,python加入path
    set PATH=%PATH%;%PERL_PATH%;%PYTHON_PATH% rem 进入qt源码目录
    cd /D %QT5_SRC_PATH% rem 下面这句是用来清除所有的编译临时文件,有需要时再打开注释,比如想从头开始重新编译
    git submodule foreach --recursive "git clean -dfx"
 

http://wangjie.rocks/2015/12/28/compile-qt/

编译 Qt 5.6(使QtWebEngine支持XP)的更多相关文章

  1. 让VC2012生成的程序支持XP系统(QT的DLL都是支持XP的,只与EXE有关)

    如果用的编译器是VC2012以上,那么默认生成出的程序是不能运行在XP系统上的.所以需要修改链接参数 我们要做的是修改qmake.conf文件中的参数,文件路径根据开发环境不同而不同下面以5.1.1 ...

  2. 让VC2012生成的程序支持XP系统(修改mkspecs\win32-msvc2012\qmake.conf,QT的DLL都是支持XP的,只与EXE有关)good

    如果用的编译器是VC2012以上,那么默认生成出的程序是不能运行在XP系统上的.所以需要修改链接参数 我们要做的是修改qmake.conf文件中的参数,文件路径根据开发环境不同而不同下面以5.1.1 ...

  3. Qt5.5.0在Windows下静态编译(修改参数以后才能支持XP)good

    测试系统环境: windows 7 编译软件环境: vs2013 + QT5.5.0 [源码地址:http://download.qt.io/official_releases/qt/5.5/5.5. ...

  4. qt pro 设置编译参数,支持 xp

    #兼容 XP VS2015 5.01 版本 win32 { QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01 QMAKE_LFLAGS_CONSOLE = ...

  5. 官方发布的新版本Qt已经不支持XP了,要自己从源代码编译

    官方发布的新版本Qt已经不支持XP了,要自己从源代码编译,编译选项里有个-target项,用来提供XP支持的,编译时加上-target xp就可以了 http://www.qtcn.org/bbs/r ...

  6. 让VC6.0编译出来的程序支持XP样式或XP风格

    (1)VC6.0编译出来的win32程序不支持winxp样式的原因:微软WINXP系统更新了Comctl32.dll(ver 6.0)这个“XP风格”的控件.为了保留传统的Windows界面风格,特地 ...

  7. Chromium CEF 2623 -- 支持 xp 的最后一个版本源码下载和编译步骤

    背景 因为项目需要在客户端中内嵌浏览器,需要支持 xp 操作系统和播放视频,但 CEF 2623 以后的版本已经不支持 xp 操作系统,也不再提供 2623 版本的二进制发布包下载,只好自己手动编译. ...

  8. 记一次在mac上源码编译curl,使其支持NSS的过程

    一.背景 在一次学习https原理的过程中,希望客户端指定特定的cipher suites来抓包分析SSL/TLS的握手过程,就想到了使用curl工具,而不是使用浏览器. 接下来使用man curl找 ...

  9. 使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)

    一.直接使用VS2012/VS2013/VS2015生成XP兼容的可执行程序 Visual Studio刚发布时没打补丁,称为RTM版,之后会陆续发布补丁,进行bug修复和功能增强.VS2010及之前 ...

随机推荐

  1. sparksql json 合并json数据

    java public class Demo { private static SparkConf conf = new SparkConf().setAppName("demo" ...

  2. Android核心功能开发SearchView使用的开发(代码共享)

    在Android上.搜索是一个核心的用户功能.用户可以搜索可用的任何数据,的内容是否存储在设备本身或者需要促进网络接入上.Android它提供了一个框架,为用户创造一个一致的搜索的搜索体验,它可以帮你 ...

  3. 基于webRTC技术 音频和视频,IM解

    由于原来的文章 http://blog.csdn.net/voipmaker  转载注明出处. 基于WebRTC技术可实现点对点音视频.即时通信.视频会议.最新的系统组件包含: TeleICE NAT ...

  4. Visual Studio 2017 and Apache Cordova mobile apps | Andrés Zsögön

    原文:Visual Studio 2017 and Apache Cordova mobile apps | Andrés Zsögön 以下是使用Microsoft Visual Studio 20 ...

  5. iOS6 与iOS7以及7以上状态栏的颜色设置

    iOS7默认状态栏文字颜色为黑色 修改为白色的方法:(chenyong注意 我的Status bar style 使用的仍是默认值Gray style(default)) 1在Info.plist中设 ...

  6. 检测鼠标指针的改变(使用GetCursorInfo API函数)

    第一步:定义全局变量用于状态改变时的对比 var Form1: TForm1; OldCI:HICON; 第二步:添加Timer组件,Interval设置随意一般50就可以了. 增加Memo组件用于记 ...

  7. 衡量镜头解像能力性能的指标-MTF曲线

    MTF(Modulation Transfer Function,模量传递函数),是目前分析镜头解像能力的方法,可以用来评判镜头还原物体对比度的能力.说到MTF,不得不先提一下衡量镜头性能的两在重要指 ...

  8. STL关联式容器之set和multiset

    一,set和multiset的基础知识 1.set和multiset的基础 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的.所以不能指 ...

  9. WPF模拟Office2010文件菜单的TabControl模板

    原文:WPF模拟Office2010文件菜单的TabControl模板 这是Office2010中的文件菜单点开后的效果.本文我将以强大的WPF(www.itstrike.cn)来实现类似的效果.希望 ...

  10. 此C语言功能---A

    功能名称: abort 动力 能够: 异常终止的过程的 使用 法国: void abort(void); 程序示例: #include <stdio.h> #include <std ...