首页 > 代码库 > Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)
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。当然编译一向都不是一个很容易的东西,笔者在编译过程中也出现了很多问题,不过最后还是都得以解决。这篇文章包含笔者的一些经验,希望能有所帮助。
一、准备
- Visual Studio 2013 Ultimate(Express版没有测试)
- Qt 5.6.0 源代码 qt-everywhere-opensource-src-5.6.0
- Windows SDK 7.1A(一般VS自带)
- openssl-1.0.2g 源代码
- The Netwide Assembler(nasm-2.12.01-win32)(可选,编译openssl所需)
- ActivePerl
- Python-2.7.11(https://www.python.org/downloads/)
- Ruby(编译webkit所需)
- ICU4C 56.1 源代码(编译webkit所需)
- Git(用于获取webkit源代码)
- jom(可选,用于代替nmake,编译时能利用所有CPU资源)
安装ActivePerl,Python,Ruby,Git这4个工具的时候,注意勾选将可执行文件路径添加到PATH选项,避免之后手动添加。
Tips:如果笔者推荐的某些下载链接无法打开,请使用VPN或代理之类的X墙工具。
二、动态编译openssl
- 解压openssl-1.0.2g.tar.gz到C:\Qt\openssl-1.0.2g
- 解压nasm-2.12.01-win32.zip到C:\Qt\nasm-2.12.01(可选)
- 在C:\Qt创建一个空目录openssl_shared,编译的最终结果将存放到这个目录
- 打开VS2013的x86命令提示工具(这样就不用手动设置VC编译器的环境变量)
- set PATH=C:\Qt\nasm-2.12.01;%PATH% (设置NASM的环境变量,如果没有执行第二步操作,可以忽略)
- cd C:\Qt\openssl-1.0.2g
- perl Configure VC-WIN32 --prefix=C:\Qt\openssl_shared(如果忽略第二步,增加no-asm选项)
- ms\do_nasm(如果忽略第二步,执行:ms\do_ms)
- 手动编辑ms/ntdll.mak,在21行CFLAG中增加选项 /MP -D_USING_V110_SDK71_ (表示让cl用多线程编译和使用Windows SDK 7.1A)
- 修改35行LFLAGS和52行的MLFLAGS,把/subsystem:console改为/subsystem:console",5.01" (支持WinXP)
- 保存,回到CMD,执行:nmake -f ms/ntdll.mak
- 编译完成后,执行:nmake -f ms/ntdll.mak install,安装到openssl_shared目录。
三、动态编译ICU
看了icu的readme之后发现,icu提供了一个VS2010的解决方案,所以我们就直接用VS2013打开这个解决方案编译即可,具体步骤如下:
- 解压icu4c-57_1-src.zip到C:\Qt\icu
- 用VS2013打开icu\source\allinone\allinone.sln,并升级所有项目。
- 在解决方案资源管理器中针对每一个项目(除了makedata这个项目):配置属性->常规->平台工具集,选择“Visual Studio 2013 - Windows XP (v120_xp)”
- 在解决方案资源管理器中,右键解决方案->生成解决方案(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获取源代码吧:
- 打开CMD,转到C:\Qt\qt-everywhere-opensource-src-5.6.0(注意设置Git的环境变量)
- 执行:git clone git://code.qt.io/qt/qtwebkit.git
- 等待源代码下载完毕,如果出现网络错误,使用VPN再试试
- 执行:git checkout 5.6.0
五、编译Qt 5.6.0
- 解压qt-everywhere-opensource-src-5.6.0.7z到C:\Qt\qt-everywhere-opensource-src-5.6.0
- 打开VS2013的x86命令提示工具,执行以下命令:
- SET _ROOT=C:\Qt\qt-everywhere-opensource-src-5.6.0
- SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH%
- SET QMAKESPEC=win32-msvc2013
- SET _ROOT=
- SET INCLUDE=C:\Qt\icu\include;%INCLUDE%
- SET LIB=C:\Qt\icu\lib;%LIB%
- SET PATH=C:\Qt\icu\lib;%PATH%
- SET PATH=C:\Qt\icu\bin;%PATH%
- 修改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-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,即把构建生成的文件和源代码目录中的文件隔开,你也可以再创建多个其他目录,用不同的编译选项进行编译),然后执行下面的命令:
- "../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:\Qt\openssl-shared\include -L C:\Qt\openssl-shared\lib -l gdi32
- 输入y接受协议,等待配置完成
- 执行:jom(如果没有下载jom就执行nmake)
- 编译完成后,如果没有出现错误,执行,nmake install,把构建好的Qt库安装到C:/Qt/5.6.0-shared(nmake install 之前可以先执行:nmake docs,生成文档)
- QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE\",5.01\"
- QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS\",5.01\"
- DEFINES += _USING_V110_SDK71_
http://blog.csdn.net/kenier/article/details/51064791
Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)