月度归档:2011年03月

QtWebKit研究(4):生成Visual Studio 2008工程

在前面的步骤中,虽然生成了QtTestBrowser,可以简单研究一下QtWebKit的特性了。但是如果要研究代码,我们当然希望能够进行单步跟踪调试。接下来,就是生成Visual Studio工程的步骤了。

按照Build Instructions for the QtWebKit build on Windows这篇文档,生成vs工程的命令很简单,就是:

perl ToolsScriptsbuild-webkit -qt -qmakearg=”-tp vc”

实际上,会出现如下错误:

Calling ‘nmake  -C JavaScriptCore -f Makefile.DerivedSources generated_files’ in
E:webkitsqtwebkitwebkitWebKitBuildRelease/JavaScriptCore

Microsoft (R) 程序维护实用工具 9.00.21022.08 版
版权所有 (C) Microsoft Corporation。保留所有权利。

NMAKE : fatal error U1052: 未找到文件“Makefile.DerivedSources”
Stop.
Failed to generate JavaScriptCore’s derived sources!

新的解决方法是,建立一个存放vs工程的目录,比如在QtWebKit源码的顶级目录建立一个vs目录,然后cd到该目录,输入

qmake -r <RelativePathToWebKitSources>DerivedSources.pro -o Makefile.DerivedSources

nmake -f Makefile.DerivedSources generated_files

qmake -r -tp vc <RelativePathToWebKitSources>WebKit.pro

其中RelativePathToWebKitSources为相对于QtWebKit源码顶级目录的相对路径。生成的solution文件为WebKit.sln,可以使用Visual Studio 2008打开。不过WebCore工程会加载失败,因为solution文件中该project的路径不对,使用文本编辑器修改一下即可。

QtWebKit_sln

可以用Visual Studio 2008编译QtWebKit了,不过编译过程中免不了会有一些状况的,根据情况添加头文件包含路径,没什么技术难度了。

最后,在lib目录下会生成一个QtWebKit4.dll。

QtWebKit研究(3):编译源代码

首先安装一些必须的工具,都是开源的,可以从网上下载:

  • 安装ActiveState Perl
  • 安装Python 2.x
  • 安装下列GNU工具,可以在GnuWin32 Project找到。
    • Bison
    • GPerf
    • Flex
    • LibIconv
    • Make

注意:将上述工具安装在不带空格的路径上,比如不要安装在“C:Program Files”

接下来,设置path环境变量,加上perl, python以及GNU工具的可执行程序路径。另外,您还需要设置QTDIR环境变量指向Qt安装路径,并将%QTDIR%/bin添加到path环境变量。

最后,开始编译QtWebKit:

  • 打开Visual Studio 2008命令提示
  • 输入cd <your WebKit source path>
  • 输入命令perl ToolsScriptsbuild-webkit -qt –release

经过漫长的编译,结果出现如下所示的错误:

jscore.lib(OSRandomSource.obj) : error LNK2019: 无法解析的外部符号 __imp__CryptReleaseContext@8,该符号在函数 “void __cdecl WTF::cryptographicallyRandomValuesFromOS(unsigned char *,unsigned int)” (?cryptographicallyRandomValuesFromOS@WTF@@YAXPAEI@Z) 中被引用
jscore.lib(OSRandomSource.obj) : error LNK2019: 无法解析的外部符号 __imp__CryptGenRandom@12,该符号在函数 “void __cdecl WTF::cryptographicallyRandomValuesFromOS
(unsigned char *,unsigned int)” (?cryptographicallyRandomValuesFromOS@WTF@@YAXPAEI@Z) 中被引用
jscore.lib(OSRandomSource.obj) : error LNK2019: 无法解析的外部符号 __imp__CryptAcquireContextW@20,该符号在函数 “void __cdecl WTF::cryptographicallyRandomValuesFromOS(unsigned char *,unsigned int)” (?cryptographicallyRandomValuesFromOS@WTF@@YAXPAEI@Z) 中被引用
releasejsc.exe : fatal error LNK1120: 3 个无法解析的外部命令
NMAKE : fatal error U1077: “”D:Program FilesMicrosoft Visual Studio 9.0VCBINlink.EXE””: 返回代码“0×460”
Stop.
NMAKE : fatal error U1077: “”D:Program FilesMicrosoft Visual Studio 9.0VCBINnmake.exe””: 返回代码“0×2”
Stop.
NMAKE : fatal error U1077: “cd”: 返回代码“0×2”
Stop.

解决方法:修改SourceJavaScriptCoreJavaScriptCore.pri行中的

win32-* {
    LIBS += -lwinmm
}


win32-* {
    LIBS += -lwinmm -lAdvapi32
}

再次运行

perl ToolsScriptsbuild-webkit -qt –release

在WebKitBuildReleasebin目录下会生成QtTestBrowser.exe,这是一个简单的Qt浏览器,界面如下图所示:

QtTestBrowser

QtWebKit研究(2):获取QtWebKit源码

QtWebKit是webkit在Qt上的移植版本。在Qt 4.7之前,QtWebKit一直是作为Qt的一部分,之后有独立的QtWebKit发布版本,当前稳定版本为QtWebKit 2.0.0,可以从http://gitorious.org/webkit/qtwebkit/archive-tarball/460b651c下载源代码。不过从这个地址下载非常慢,所以我选择从源代码库直接下载。

QtWebKit代码库托管在Gitorious.org上,采用的是git系统。所以还需要在windows上安装git客户端工具。Windows上比较好的git工具是msysgit,提供了Windows安装包。安装过程就不用多说了,安装完后,打开你要保存源代码的目录,点击鼠标右键,从右键菜单中选择”git bash”,会出现一个命令行窗口,在这里你就可以输入git命令了。参照QtWebKit的说明,输入如下命令获取源代码:

$ git clone git://gitorious.org/webkit/webkit.git

好事多磨,获取源代码经常失败,信息如下:

$ git clone git://gitorious.org/webkit/webkit.git
Cloning into webkit…
remote: Counting objects: 1072275, done.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

而且git不像SVN,不能接着上次的中断处续传(是git没有学好?)几次都是传到20%就挂了,又重新开始,代码就是下不下来。从网上找到一篇文章,专门针对gitorious.org的The remote end hung up unexpectedly错误给出了解决方法,原文在这里( 需要翻墙才能阅读:) )。大概的意思就是gitorious.org的服务太忙了,建议采用ssh协议,不要用git协议。这需要在gitorious.org上申请一个账号。申请账号很简单,只需要提供一个电子邮箱,然后收到一封邮件激活就可以了。接下来还需要:

1. 在本机上生成一个公钥,在git bash命令行上输入命令,然后一路回车即可。

$ ssh-keygen -t rsa

2. 登录gitorious.org,点击Manage SSH Keys,然后点击Add SSH Key,输入本机上的公钥,最后点击Save。本机上的公钥可以使用如下命令查看:

$ cat ~/.ssh/id_rsa.pub

3. 使用如下git命令获取QtWebKit源码:

$ git clone git@gitorious.org:webkit/webkit.git

到此,你可以喝杯咖啡,起来活动活动筋骨了:)

(后记:使用git clone命令似乎只要网络中断或者用ctrl+c中断后,又必须开始,经过一番周折取到了qtwebkit的源码,发现实际上和从webkit svn上取的代码是一样的)

QtWebKit研究(1):在Windows XP上安装Qt开发环境

之前一直是在Ubunut下使用Qt,不过工作上很多时候又离不开Windows,所以经常在Ubuntu和Windows XP两个系统切换,感觉不方便。在Windows虚拟机上安装Ubuntu,感觉又太慢。最后决定还是在Windows上安装Qt开发环境。

安装非常简单,首先上http://qt.nokia.com/downloads-cn下载用于Windows的Qt库,然后下一个Visual Studio Add-in,这样就可以在Visual Studio 2008上进行Qt开发了。

安装过程就不多说了,安装完后,点击开始->程序->Qt by Nokia 4.7.1 (VS2008 OpenSource)->Visual Studio with Qt 4.7.1, 即可启动Visual Studio 2008,新建项目中就有Qt4 Projects选项了,如下图所示:

vs_qt4_new_project

可以通过向导建立一个包含窗口的应用程序,自此Qt的开发环境就建好了。

CSS相关细节

最近在跟踪CSS处理相关的BUG,发现CSS很多细节还不清楚,参阅了http://www.w3school.com.cn,了解了一些之前都未接触过的CSS用法,特记录下来,供今后参阅。

CSS 单位

尺寸

单位 描述
% 百分比
in 英寸
cm 厘米
mm 毫米
em

1em 等于当前的字体尺寸。

2em 等于当前字体尺寸的两倍。

例如,如果某元素以 12pt 显示,那么 2em 是24pt。

在 CSS 中,em 是非常有用的单位,因为它可以自动适应用户所使用的字体。

ex 一个 ex 是一个字体的 x-height。 (x-height 通常是字体尺寸的一半。)
pt 磅 (1 pt 等于 1/72 英寸)
pc 12 点活字 (1 pc 等于 12 点)
px 像素 (计算机屏幕上的一个点)
其中ex是一个非常令人迷惑的单位,看看W3C的CSS 2.1是如何说的:

The ‘ex’ unit is defined by the element’s first available font. The exception is when ‘ex’ occurs in the value of the ‘font-size’ property, in which case it refers to the ‘ex’ of the parent element.

The ‘x-height’ is so called because it is often equal to the height of the lowercase “x”. However, an ‘ex’ is defined even for fonts that do not contain an “x”.

The x-height of a font can be found in different ways. Some fonts contain reliable metrics for the x-height. If reliable font metrics are not available, UAs may determine the x-height from the height of a lowercase glyph. One possible heuristic is to look at how far the glyph for the lowercase “o” extends below the baseline, and subtract that value from the top of its bounding box. In the cases where it is impossible or impractical to determine the x-height, a value of 0.5em should be used.

简单说来,就是等于小写字母”x”的高度,更简单的处理是1ex=0.5em.

颜色

单位 描述
(颜色名) 颜色名称 (比如 red)
rgb(x,x,x) RGB 值 (比如 rgb(255,0,0))
rgb(x%, x%, x%) RGB 百分比值 (比如 rgb(100%,0%,0%))
#rrggbb 十六进制数 (比如 #ff0000)