blog文章地址:http://godebug.org/index.php/archives/133/
WebKit是个好东西,做爬虫、显示网页还是想用HTML来做桌面应用的界面都可以用他,不过一直以来都觉得自己编译webkit费力不讨好,所以都是用的qt官方编译好的,至于静态编译webkit,我之前一直以为是根本不可能的。后来看qt forum上说其实是可以的,不过是因为开源协议的问题qt默认的静态编译只是把webkit给排除了,自己编译一下webkit就好了,既然如此,那我就当小白试一下。不过最后发现静态编译webkit其实也不难,就是比较麻烦,占用了几十个G的硬盘历时一天终于把这玩意编译完了。所以简单记一下编译的流程,方便大家。不过得提醒大家闭源项目静态链接qt和webkit是违反LGPL协议的,除非你把你的程序以GPL协议开源,要不就是违法的。
首先是乱七八糟的工具的安装
1.Python,我机器上本来就用py 2.7和3.3,不过编译的时候用的是2.7
2.Ruby,我装的是 2.2.1,官网上说需要ruby,不过编译的过程中我没发现有什么地方用到这玩意,而且在windows上装个ruby也不是太有用,各位可以先不装他,等编译的时候遇到问题再装也不迟,我就不去试到底需不需要了.....
3.Perl,webkit和OpenSSL的编译脚本就是perl写的,这个是铁定要用了
4.OpenGL ES SDK,我也不知道为什么要用到这玩意,我明明选的是-opengl desktop,估计是qt的一个bug
4.一个编译器,看你自己想用什么了,我用的是vs2013
这些都装好了之后就是加两个第三方的库,icu和OpenSSL,icu是编译webkit所必须的,OpenSSL不是必须的,前提是你不打算用webkit访问https的网站...
我一开始尝试自己编译icu,这货倒也不是太难编译,不过就是编译选项中没有任何方法能改成使用静态运行时的,要自己改config和makefile文件,我懒得动弹,就找了个现成的编译好的Precompiled ICU,不过用这里的icu有个问题,就是它提供的静态编译的icu库木有pdb调试信息,在链接的时候会有一堆LNK4099的warning,这傻逼warning虽然可以确定是完全人畜无害的(我们几乎没可能去调试icu里面的代码),但是因为VS有个操蛋的bug,这个wrning是无法屏蔽的,而因为QtCore也用到了icu,于是你每个qt项目都会看到一堆LNK4099的warning.....每次编译的时候...WTF...如果不想看到,就自己编译icu吧,这个链接也给了让icu静态链接运行时的patch,自己动手丰衣足食。
编译 OpenSSL我就不多说了,比较简单,我之前也写过http://www.godebug.org/index.php/archives/104/
都搞定之后,开始编译Qt,直接下载zip格式的源码,不要用tar的,里面缺少configure.exe,那是给linux用的,解压,我放在F:\qt-everywhere-opensource-src-5.4.1\,然后是修改mkspace中的配置文件,因为Qt也没有能从命令行修改为使用静态运行时的选项,找到qtbase\mkspace\编译器名\qmake.conf,编辑,把里面的两个MD都改成MT,一个MDd改成MTd就可以了,我这里用的是VS,gcc的话应该是把QMAKE_CXXFLAGS一项中加个-static,保存就可以了。
然后是设置环境变量,这里我建议直接屏蔽系统的环境变量,全部都重新设置,因为系统装安装的乱七八糟工具都有可能影响编译,比如说装了msysgit什么的,里面的perl.exe就会有影响。开个命令提示符CD到源码的根目录,
set PATH=C:\Windows;C:\Windows\System32;D:\Ruby22-x64\bin;C:\Python27;C:\Python27\Scripts;F:\icu\lib;F:\icu\bin;F:\gles_sdk\x86;D:\Perl64\bin;F:\openssl\bin;
set INCLUDE=F:\icu\include;F:\gles_sdk\include;F:\openssl\include;
set LIB=F:\icu\lib;F:\gles_sdk\x86;F:\openssl\lib;
"D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
上面的路径请自行换成对应的目录。然后就可以configure了:
configure -prefix D:\Qt\Static541_2013 -debug-and-release -opensource -static -nomake examples -no-compile-examples -opengl desktop -openvg -platform win32-msvc2013 -target xp -sse4.2 -no-avx -no-avx2 -icu -openssl-linked
configure完直接nmake 然后nmake install,经过漫长的等待,没问题的话在D:\Qt\Static541_2013就可以看到编译好的lib了。
这时候静态版本的Qt已经编译好了,接下来就该搞webkit了。
编译完之后不要关闭命令提示符,接着执行以下几条命令:
set PATH=%PATH%D:\Qt\Static541_2013\bin;F:\qt-everywhere-opensource-src-5.4.1\gnuwin32\bin;
set INCLUDE=%INCLUDE%D:\Qt\Static541_2013\include;
set LIB=%LIB%D:\Qt\Static541_2013\lib;D:\Qt\Static541_2013\plugins;D:\Qt\Static541_2013\plugins\audio;D:\Qt\Static541_2013\plugins\bearer;D:\Qt\Static541_2013\plugins\designer;D:\Qt\Static541_2013\plugins\geoservices;D:\Qt\Static541_2013\plugins\iconengines;D:\Qt\Static541_2013\plugins\imageformats;D:\Qt\Static541_2013\plugins\mediaservice;D:\Qt\Static541_2013\plugins\platforms;D:\Qt\Static541_2013\plugins\playlistformats;D:\Qt\Static541_2013\plugins\position;D:\Qt\Static541_2013\plugins\printsupport;D:\Qt\Static541_2013\plugins\qml1tooling;D:\Qt\Static541_2013\plugins\qmltooling;D:\Qt\Static541_2013\plugins\sensorgestures;D:\Qt\Static541_2013\plugins\sensors;
最后那个set命令中的一大堆plugin的lib目录应该是不用加的,qmake会自己找到这些lib,但是我没测试过(也不想去试),谁有兴趣可以试试..然后就是编译webkit了..
perl F:\qt-everywhere-opensource-src-5.4.1\qtwebkit\Tools\Scripts\build-webkit --qt --prefix=d:\Qt\QtWebkit
这里的prefix好像加和不加都一个样,反正编译完都会自动把生成的lib给放到Qt SDK的目录下,这个prefix指定的目录却什么也没有。炒鸡漫长的等待..看机器性能,我反正是编译了大约5、6个小时,期间机器卡的不行,就只能看个网页或者电子书。
编译还算顺利,只遇到了一个错误,原因是没有判断是否是静态编译,用了dllimport:
打开F:\qt-everywhere-opensource-src-5.4.1\qtwebkit\Source\WebCore\platform\qt\QtTestSupport.h,把
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT Q_DECL_EXPORT
#else
#define TESTSUPPORT_EXPORT Q_DECL_IMPORT
#endif
改成:
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT /*Q_DECL_EXPORT*/
#else
#define TESTSUPPORT_EXPORT /*Q_DECL_IMPORT*/
#endif
重新运行上面的编译命令,一路顺畅,终于编译完了...编译完成后他会自动把qtwebkit的lib拷贝到你的qt sdk所在的目录,接下来就是配置qt creator或者qt vs plugin了,没什么好说的了
我试着编译了一下qt example中的browser项目,得到了一个51.1mb的exe,upx -9一下就成了16.6m,除了我手残编译qt的时候忘了加openssl所以不能访问https的网站之外功能没有缺失(上面教程是按照加了openssl来写的),我也懒得再编译了,有空再说吧。
另外根据我编译qt得出的经验,一般Qt5.X.0编译都或多或少有各种问题,要么语法问题,要么少东西,要么路径不对,但是过不久会放出一个5.X.1和5.X.2就一般没什么问题了,为什么会这样就不知道了。
http://www.ituring.com.cn/article/195148
http://www.qtcn.org/bbs/read-htm-tid-59674-page-e.html#a