静态编译Qt5.4.1和Qt WebKit



图灵社区文章地址:http://www.ituring.com.cn/article/195148
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:
f1.png

打开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就一般没什么问题了,为什么会这样就不知道了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一个跨平台的开源C++应用程序框架,它提供了无数的工具和组件,用于创建GUI应用程序。Qt5.4.1Qt的一个版本,它是一个旧的版本,但是在Linux系统上,它仍然是一种常见的Qt版本。 Qt5.4.1为Linux操作系统提供了完全的支持,并可以在Linux的多种发行版中运行。Qt5.4.1提供了一系列的工具和库,可以让开发者轻松的创建跨平台的应用程序,并且它们可以在多个平台上运行。在Linux上,Qt5.4.1支持了X11平台,这是Linux上默认的窗口系统。 Qt5.4.1提供了许多新的功能和工具,这些新功能使得开发者可以更容易地构建高质量的应用程序。一些新的功能包括新的QtQuick Controls模块,它们提供了一些新的控件和样式,另外还有Qt 3D模块,用于构建3D应用程序。除此之外,Qt5.4.1还提供了Qt Network模块,用于网络通信;Qt WebKit模块,用于网页浏览器开发。 总而言之,Qt5.4.1是一个非常强大的跨平台框架,它可以帮助开发者在Linux平台上快速构建高质量的GUI应用程序。Qt5.4.1不仅提供了各种组件和工具,还可以为开发者节省时间和精力,让他们更专注于实现应用程序本身。 ### 回答2: Qt是一款跨平台的C++应用程序开发框架,Qt5.4.1是该框架的一个版本,适用于在Linux操作系统上进行应用程序开发。Qt5.4.1提供了丰富的图形用户界面、网络通信、数据库访问、多媒体处理等功能模块,使得开发者能够快速轻松地创建高质量的应用程序。Qt5.4.1在Linux上的应用开发通常需要使用Qt Creator进行开发工作,可以通过apt-get命令进行安装。在进行Qt应用程序开发的过程中,需要掌握一定的C++编程基础,并且了解Qt框架的相关知识和API函数的使用方法。Qt5.4.1已经得到广泛应用,在各种类型的应用开发中都有所体现,比如工业控制、嵌入式开发、桌面应用程序等。借助于Qt5.4.1的高度可移植性和跨平台特性,开发者可以快速地将一个应用程序跑在不同的平台上,实现高效、灵活的开发和发布。综上所述,Qt5.4.1 for Linux是一个非常实用的C++应用程序开发框架,可以帮助开发者快速高效地创建高质量的应用程序。 ### 回答3: Qt 5.4.1是一种跨平台的应用程序框架,它允许开发人员编写具有GUI界面的软件,并能在Windows,Mac,Linux等各种操作系统上运行。Qt 5.4.1适用于Linux操作系统,包括各种发行版,例如Ubuntu,Fedora,Debian等。 有一些重要的特性使得Qt 5.4.1在Linux系统上优秀。首先,Qt 5.4.1为开发者提供了一整套GUI工具和库,让他们可以创建出具有吸引力的GUI应用程序。此外,Qt 5.4.1可以很好的适应Linux平台并与其兼容,因此它能够更好地发挥应用程序的性能和速度。此外,Qt 5.4.1还提供了许多工具和库,开发者可以利用它们轻松地创建出多媒体应用程序,例如音频和视频应用程序。 总体来说,Qt 5.4.1是一种非常强大的跨平台的应用程序框架,Linux用户可以充分利用它开发自己的应用程序。无论是专业开发者还是普通用户,Qt 5.4.1都为他们提供了一个广泛的工具和库,可以用来编写出令人印象深刻的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值