静态编译Qt5.4.1和Qt WebKit

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

时间: 2025-01-23 21:15:44

静态编译Qt5.4.1和Qt WebKit的相关文章

静态编译OpenSSL并整合到Qt

静态编译OpenSSL并整合到Qt 来源 https://blog.csdn.net/lixiaoxin1989/article/details/78421573 MSVC版本: 1. 下载OpenSSL源码 1.1 下载OpenSSL的源码:https://www.openssl.org/source/ 1.2 解压到C:\openssl-1.0.2l 2. 编译OpenSSL源码 2.1 打开VS的命令工具: 32位: 64位: 2.2 使用cd命令定位到源码文件夹: cd C:\opens

Win10 VS2015 静态编译Qt5.6.2源码

由于VS2015需要CRT等拓展组件,因此把内部编写的工具软件以静态发布,固需要编译Qt源码.Qt5.6.2版本,VS2015,Win10 1.安装python,perl,下载jom 2.改文件common/msvc-desktop.conf QMAKE_CFLAGS_RELEASE = -O2 -MTQMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -ZiQMAKE_CFLAGS_DEBUG = -Zi -MTd 3.vs2015命令行静态编译命名,

C++ Qt 框架静态编译 操作记录

谁愿意写个程式出来之后还附带一堆DLL,尤其是名字如此明显的名字. 于是在网上看了看,是需要下载源代码然后进行编译的,但是看了看别人说的编译时间,长达几个小时,瞬间就感觉不想做了.因为我还需要抓紧时间code. 于是利用某某搜索引擎找了个 Qt 5.1 已经静态编译完毕之后的包.在文章的最后会提供下载地址,我们为了节约可贵的时间,我们之间使用别人已经编译好的包来进行静态编译. 首先我们下载Qt 5.1(下载地址在文章的最后) 然后我是直接放在 C盘下的 打开Qt Creator -> Tools

Linux下静态编译Qt

Qt采用编译的方式安装的时候,配置中默认的编译方式是动态编译的,但是有时候你编写的程序要发布出去,带很多动态库文件是很繁琐的,此时就需要静态编译你的程序,Qt要实现静态编译必须库文件也是静态编译的,所以在此介绍一下qt如何来进行静态编译 第一步:下载源码包 Qt/X11版本:qt-x11-opensource-src-x.x.x.tar.gz 第二步:解压缩 tar zxvf qt-x11-opensource-src-x.x.x.tar.gz 第三步:进入到刚才解压缩后的文件夹下并进行配置,如

QT5.4 vs2013静态编译之加载静态插件sqlite

1. 很多同学在静态编译QT5完成后, sqlite的驱动老是加载不进去, 原因可能是因为你没有如下操作: #include <QtPlugin> Q_IMPORT_PLUGIN(QSQLiteDriverPlugin) 记得是 QSQLiteDriverPlugin 而不是 qsqlite 当然你在编译的时候的configure 要把插件编进去-plugin-sql-sqlite

QT5.4 vs2013静态加载插件的sqlite静态编译

1. 非常多同学在静态编译QT5完毕后, sqlite的驱动老是载入不进去, 原因可能是由于你没有例如以下操作: #include <QtPlugin> Q_IMPORT_PLUGIN(QSQLiteDriverPlugin) 记得是 QSQLiteDriverPlugin 而不是 qsqlite 当然你在编译的时候的configure 要把插件编进去-plugin-sql-sqlite

Qt 5.9.3 如何静态编译和部署?

Qt 5.9.3 如何静态编译和部署? MSVC2015 x86 静态编译 Qt 部署静态库 VS2015 部署静态库 1. MSVC2015 x86 静态编译 1.1 Qt 官网下载最新源代码 立即下载 1.2 参考 Qt 官网提供的教程 Qt for Windows - Building from Source Qt Configure Options Qt for Windows - Requirements 参考上面文档后,发现需要安装以下依赖: ActivePerl Python 成功

win7 32位下 QT4.8.6 从安装配置到静态编译

  最近用QT编了一个很水的小程序,虽然之前用过QT但是编出来的程序都是在本机运行,本地的环境什么的当然配置好了能运行,但是拿到别的机子上就不行了,QT默认的编译方式是动态编译,即运行程序需要依赖QT动态链接库中的dll文件,如果想在别的电脑上运行你的程序,就需要把这些dll文件一起放到exe下一起带走,但是QT有几个动态链接库太大了一个就要上百兆,如果你的程序中需要用到这些dll文件中的东西,就需要一起带走,这样的话你做一个很小的程序最后需要运行的话足足要几百兆的空间,很是浪费.还好QT提供了

用mingw静态编译Qt4.8.2和Qt5.1.1(需要修改不少源码)

因为一些乱七八糟的原因,我需要用mingw静态编译Qt4.8.2和Qt5.1.1.经历了一天的折腾之后,自觉编译一下Qt还是件颇为麻烦的事情,故将过程略作总结,以备不时之需. 首先,在编译之前,我需要下载mingw.qt-everywhere-opensource-src-4.8.2和qt-everywhere-opensource-src-5.1.1. 然后,准备开始编译了,当然先得把压缩包解压到一个合适的地方.我这里的路径是"C:\Qt"下面. 解压完毕后,先试着编译Qt4.8.2