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


    经历了多次延期后,在3月16号,Qt发布了5.6.0版本(全面支持高DPI无疑是一个亮点),从5.6.0版本开始,Qt直接移除了webkit模块,让webengine作为其替代选择,不过webengine无法为WinXP编译(参考:https://bugreports.qt.io/browse/QTBUG-49900)。如果你还有用户仍在WinXP上使用webkit,Qt官方给的解决方案是你可以自己编译webkit。当然编译一向都不是一个很容易的东西,笔者在编译过程中也出现了很多问题,不过最后还是都得以解决。这篇文章包含笔者的一些经验,希望能有所帮助。

    一、准备

    1. Visual Studio 2013 Ultimate(Express版没有测试)
    2. Qt 5.6.0 源代码 qt-everywhere-opensource-src-5.6.0
    3. Windows SDK 7.1A(一般VS自带)
    4. openssl-1.0.2g 源代码
    5. The Netwide Assembler(nasm-2.12.01-win32)(可选,编译openssl所需)
    6. ActivePerl
    7. Python-2.7.11(https://www.python.org/downloads/)
    8. Ruby(编译webkit所需)
    9. ICU4C 56.1 源代码(编译webkit所需)
    10. Git(用于获取webkit源代码)
    11. jom(可选,用于代替nmake,编译时能利用所有CPU资源)

    安装ActivePerl,Python,Ruby,Git这4个工具的时候,注意勾选将可执行文件路径添加到PATH选项,避免之后手动添加。

    Tips:如果笔者推荐的某些下载链接无法打开,请使用VPN或代理之类的X墙工具。
     

    二、动态编译openssl

    1. 解压openssl-1.0.2g.tar.gz到C:Qtopenssl-1.0.2g
    2. 解压nasm-2.12.01-win32.zip到C:Qt asm-2.12.01(可选)
    3. 在C:Qt创建一个空目录openssl_shared,编译的最终结果将存放到这个目录
    4. 打开VS2013的x86命令提示工具(这样就不用手动设置VC编译器的环境变量)
    5. set PATH=C:Qt asm-2.12.01;%PATH% (设置NASM的环境变量,如果没有执行第二步操作,可以忽略)
    6. cd C:Qtopenssl-1.0.2g
    7. perl Configure VC-WIN32 --prefix=C:Qtopenssl_shared(如果忽略第二步,增加no-asm选项)
    8. msdo_nasm(如果忽略第二步,执行:msdo_ms)
    9. 手动编辑ms/ntdll.mak,在21行CFLAG中增加选项 /MP -D_USING_V110_SDK71_ (表示让cl用多线程编译和使用Windows SDK 7.1A)
    10. 修改35行LFLAGS和52行的MLFLAGS,把/subsystem:console改为/subsystem:console",5.01" (支持WinXP)
    11. 保存,回到CMD,执行:nmake -f ms/ntdll.mak
    12. 编译完成后,执行:nmake -f ms/ntdll.mak install,安装到openssl_shared目录。
     

    三、动态编译ICU

     
    看了icu的readme之后发现,icu提供了一个VS2010的解决方案,所以我们就直接用VS2013打开这个解决方案编译即可,具体步骤如下:
     
    1. 解压icu4c-57_1-src.zip到C:Qticu
    2. 用VS2013打开icusourceallinoneallinone.sln,并升级所有项目。
    3. 在解决方案资源管理器中针对每一个项目(除了makedata这个项目):配置属性->常规->平台工具集,选择“Visual Studio 2013 - Windows XP (v120_xp)”
    4. 在解决方案资源管理器中,右键解决方案->生成解决方案(Debug和Release都生成一次)。
     

    四、获取webkit源代码

     

    qt-everywhere-opensource-src-5.6.0.7z里面已经没有webkit的源代码了,笔者刚开始尝试去下载5.5.1版本的webkit源代码,但是在编译过程中出现了一个链接错误:LINK : fatal error LNK1104: cannot open file 'OPT:REF.obj',经过一番查找发现是webkit配置文件中的一个转义错误,参考:https://bugreports.qt.io/browse/QTBUG-50607,评论中指出已经在git修复。所以:)还是用git获取源代码吧:

    1. 打开CMD,转到C:Qtqt-everywhere-opensource-src-5.6.0(注意设置Git的环境变量)
    2. 执行:git clone git://code.qt.io/qt/qtwebkit.git
    3. 等待源代码下载完毕,如果出现网络错误,使用VPN再试试
    4. 执行:git checkout 5.6.0
     

    五、编译Qt 5.6.0

    1. 解压qt-everywhere-opensource-src-5.6.0.7z到C:Qtqt-everywhere-opensource-src-5.6.0
    2. 打开VS2013的x86命令提示工具,执行以下命令:
    3. SET _ROOT=C:Qtqt-everywhere-opensource-src-5.6.0
    4. SET PATH=%_ROOT%qtbasein;%_ROOT%gnuwin32in;%PATH%
    5. SET QMAKESPEC=win32-msvc2013
    6. SET _ROOT=
    7. SET INCLUDE=C:Qticuinclude;%INCLUDE%
    8. SET LIB=C:Qticulib;%LIB%
    9. SET PATH=C:Qticulib;%PATH%
    10. SET PATH=C:Qticuin;%PATH%
    11. 修改C:Qtqt-everywhere-opensource-src-5.6.0qtbasemkspecscommonmsvc-desktop.conf的74行和75行为:/SUBSYSTEM:CONSOLE",5.01" 和 /SUBSYSTEM:WINDOWS",5.01"
    12. 在C:Qt下面创建一个qt-5.6.0-build-shared和5.6.0-shared空目录,qt-5.6.0-build-shared为构建目录,5.6.0-shared为安装目录,然后把CMD转到qt-5.6.0-build-shared目录(在这个目录中进行编译,称之为shadow build,即把构建生成的文件和源代码目录中的文件隔开,你也可以再创建多个其他目录,用不同的编译选项进行编译),然后执行下面的命令:
    13. "../qt-everywhere-opensource-src-5.6.0/configure.bat" -prefix C:/Qt/5.6.0-shared -debug-and-release -opensource -ltcg -nomake examples -nomake tests -skip qtwebengine -skip qtwebview -accessibility -plugin-sql-odbc -plugin-sql-sqlite -opengl dynamic -target xp -largefile -D _USING_V110_SDK71_ -qt-zlib -qt-pcre -icu -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -rtti -ssl -openssl -mp -I C:Qtopenssl-sharedinclude -L C:Qtopenssl-sharedlib -l gdi32
    14. 输入y接受协议,等待配置完成
    15. 执行:jom(如果没有下载jom就执行nmake)
    16. 编译完成后,如果没有出现错误,执行,nmake install,把构建好的Qt库安装到C:/Qt/5.6.0-shared(nmake install 之前可以先执行:nmake docs,生成文档)
     
    现在你就可以用QtCreator添加一个Qt版本来测试了,注意在pro文件中增加:
    [plain] view plain copy
     
    1. QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE",5.01"  
    2. QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS",5.01"  
    3. DEFINES += _USING_V110_SDK71_  

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

  • 相关阅读:
    UVa 11181 (条件概率) Probability|Given
    UVa 1636 (概率) Headshot
    UVa 1262 (第k字典序) Password
    HDU 4746 (莫比乌斯反演) Mophues
    HDU 1695 (莫比乌斯反演) GCD
    POJ 3090 (欧拉函数) Visible Lattice Points
    CodeForces Round #283 Div.2
    UVa 10820 (打表、欧拉函数) Send a Table
    UVa 1635 (唯一分解定理) Irrelevant Elements
    Java基础10 接口的继承与抽象类
  • 原文地址:https://www.cnblogs.com/findumars/p/6336419.html
Copyright © 2020-2023  润新知