转载自:http://xjchilli.blog.163.com/blog/static/4534773920091016115533158/

webkit的官方网站写的webkit需要在vs2005的环境下编译,而我的机器只装了vs2008,我可不想在装一个vs2005.所以我就打算在vs2008里面试试编webkit,最终的结果是可以编译出来,但是运行不起来。

步骤如下:

1. 下载webkit代码。webkit使用svn下载后差不多有1G多,这里面的大部分代码是测试代码,由于网速慢加上现在不需要这些测试代码,我下载的是Nightly Builds代码(http://nightly.webkit.org/里面的Source),下载后只有十几兆。

2. 下载cygwin,最好按照http://webkit.org/building/tools.html里面的下载安装cygwin,不如后面编译时perl脚本会报错,原因是cygwin的某些模块没有安装,我就遇到过报确实Registry 模块的错。

你可以到WebKitTools\Scripts下看perl脚本,例如Registry 模块就是在num-cpus用的:

#!/usr/bin/perl

use strict; 

use warnings;

use Win32API::Registry 0.21 qw( :ALL );

my $key; 

my $i = 0; 

while (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\$i", 0, KEY_READ, $key)) { 

    $i++; 

    RegCloseKey($key); 

}

print "$i\n";

3. 我将cygwin是装在d盘,我不喜欢将东西装在c盘。所以我使用Junction将cygwin映射到c盘(Junction请参考http://blog.csdn.net/chief1985/archive/2009/08/16/4453475.aspx)。如果你将vs2005装在其他盘也可以使用这个方法进行映射。

4. 将webkit放到cygwin的home目录(cd ~)下。

cygwin的一些文章可以参考:

Cygwin的中文支持(解决乱码)

为shell下执行svn命令设置代理

设置Cygwin的home目录

5. 下载WebKitSupportLibrary.zip,放到webkit目录下,不要解压。设置windows环境变量:

WEBKIT_DIR = C:\cygwin\home\xufan\WebKit

WEBKITLIBRARIESDIR = %WEBKIT_DIR%\WebKitLibraries\win

WEBKITOUTPUTDIR = %WEBKIT_DIR%\WebKitBuild

6. (可选)如果需要代理才能上网,需要修改一下WebKitTools\Scripts\update-webkit-auxiliary-libs这个脚本,我的修改如下:

use strict; 

use warnings;

use HTTP::Date qw(str2time); 

use File::Find; 

use File::Temp (); 

use File::Spec; 

use FindBin; 

use lib $FindBin::Bin; 

use webkitdirs;

sub lastModifiedToUnixTime($);

# Time in seconds that the new zip file must be newer than the old for us to 

# consider them to be different. If the difference in modification time is less 

# than this threshold, we assume that the files are the same. We need this 

# because the zip file is served from a set of mirrors with slightly different 

# Last-Modified times. 

my $newnessThreshold = 30;

my $sourceDir = sourceDir(); 

my $file = "WebKitAuxiliaryLibrary"; 

my $zipFile = "$file.zip"; 

my $auxiliaryLibsURL = "http://developer.apple.com/opensource/internet/$zipFile"; 

my $webkitLibrariesDir = toUnixPath($ENV{'WEBKITLIBRARIESDIR'}) || "$sourceDir/WebKitLibraries/win"; 

my $tmpDir = File::Spec->rel2abs(File::Temp::tempdir("webkitlibsXXXXXXX", TMPDIR => 1, CLEANUP => 1));

print "Checking Last-Modified date of $zipFile...\n"; 

my $proxy="-x 192.168.4.9:9888"; 

#my $proxy=""; 

my $result = system "curl $proxy -s -I $auxiliaryLibsURL | grep Last-Modified > \"$tmpDir/$file.headers\""; 

print STDERR "Couldn't check Last-Modified date of new $zipFile.\n" if $result;

if (!$result && open NEW, "$tmpDir/$file.headers") { 

    my $new = lastModifiedToUnixTime(<NEW>); 

    close NEW;

if (defined $new && open OLD, "$webkitLibrariesDir/$file.headers") { 

        my $old = lastModifiedToUnixTime(<OLD>); 

        close OLD; 

        if (defined $old && abs($new - $old) < $newnessThreshold) { 

            print "Current $file is up to date\n"; 

            exit 0; 

        } 

    } 

}

print "Downloading $zipFile...\n\n"; 

$result = system "curl $proxy -o \"$tmpDir/$zipFile\" $auxiliaryLibsURL"; 

die "Couldn't download $zipFile!" if $result;

$result = system "unzip", "-q", "-d", $tmpDir, "$tmpDir/$zipFile"; 

die "Couldn't unzip $zipFile." if $result;

print "\nInstalling $file...\n";

sub wanted 



    my $relativeName = File::Spec->abs2rel($File::Find::name, "$tmpDir/$file/win"); 

    my $destination = "$webkitLibrariesDir/$relativeName";

if (-d $_) { 

        mkdir $destination; 

        return; 

    }

system "cp", $_, $destination; 

}

File::Find::find(\&wanted, "$tmpDir/$file");

$result = system "mv", "$tmpDir/$file.headers", $webkitLibrariesDir; 

print STDERR "Couldn't move $file.headers to $webkitLibrariesDir" . ".\n" if $result;

print "The $file has been sucessfully installed in\n $webkitLibrariesDir\n"; 

exit;

sub toUnixPath 



    my $path = shift; 

    return unless $path; 

    chomp($path = `cygpath -u '$path'`); 

    return $path; 

}

sub lastModifiedToUnixTime($) 



    my ($str) = @_;

$str =~ /^Last-Modified: (.*)$/ or return; 

    return str2time($1); 

}

7.执行WebKitTools\Scriptsupdate-webkit,它会下载一些编译时要用的头文件和库。(我估计webkit主要是因为版权原因才不将这些头文件和库放到自己的代码里面)。如果没有出下载的进度的信息,一般是因为你在cygwin里面安装了Qt,你可以看一下环境变量里面有没有QTDIR,如果有,可以在home目录里面的.bashrc最下面加上一行 unset QTDIR

8.按照http://webkit.org/building/tools.html里面的提示安装QuickTime SDK

9. 执行WebKitTools\Scripts\build-webkit,这个必须执行,不如后面会报找不到stdint.h和stdbool.h头文件。如果你的vs不是装在c盘,一般会报错,这个没关系。cygwin里面的操作到此结束。

10.到WebKit\win\WebKit.vcproj\WebKit.sln双击打开。

11.按F7开始编译。

12.编译的时候会报treat warning as error错误,可以在vs2008里面的项目属性将treat warning as error改为NO

13.出错就进行12步里面的修改。如果你编译的是debug版,可能要将WebKitLibraries\win\lib里面的lib文件加_debug,例如将pthreadVC2.lib改为pthreadVC2_debug.lib

14.经过1个多小时的编译,会编译出webkit.dll(放在WebKitBuild\bin下面)。

15. 将Safari里面的dll拷贝到WebKitBuild\bin下面,拷贝vs 2008的crt的dll。运行WinLauncher.exe会发现报错,用depends看一下webkit.dll的依赖关系,会发现webkit同时依赖了vs2005和vs2008的库。原因是因为从Safari里面拷贝的dll依赖于vs2005,而webkit是依赖于vs2008.

16.无法运行我觉得可以用下面两种方法解决(我没有试过,大家可以试试):

一。将vs2008里面的全局include和library该为指向vs2005的include和library目录,然后再编译

二。将webkit依赖的库用vs2008编一边。chrome里面有这些库。chrome将webkit依赖的库都变为了static lib,这样最终连接的webkit.dll依赖最小,而且不会出现我们现在遇到的问题。

参考文章:

http://niuwa.org/2009/06/23/how-to-build-webkit-with-vs2005-on-windows/ (这个是我见过解释webkit编译最全的)

http://niuwa.org/tag/webkit/ 

http://nightly.webkit.org/ 

http://blog.csdn.net/northboy911/archive/2009/08/03/4405472.aspx 

http://hi.baidu.com/jiahuiren/blog/item/3aae94c7f2e09dd8d0006027.html

webkit在vs2008中编译的更多相关文章

  1. VS2008中编译运行MFC应用程序时,出现无法启动程序,因为计算机中丢失mfc90ud.dll的解决方案

     解决方法:"工具"->"选项"->"项目和解决方案"->"VC++目录",在可执行文件栏中加上如 ...

  2. VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

    .只要是“建立项目的时候不应建立空项目,而应当建立一个“win32控制台应用程序”.这样确实可以解决问题.只要你选择的是这个"win32控制台应用程序"则在附加选项里面选不选上“空 ...

  3. 在VS2008中配置WDK7600驱动开发环境

    网上这类资料多如牛毛,也许很多人都是转来转去,却很有人去真正的测试,有时候感觉确实对他人也是一种误导. 这里是我自己在VS2008 + WDK7600.16385.0 + DDKWizard配置自己的 ...

  4. VS2008编译器编译出来的文件比mingw编译的要几乎小一半

    为什么要在VS2008中使用QT静态编译呢?很简单,因为VS2008编译器编译出来的文件比mingw编译的要几乎小一半. 好了现在我们来做些准备工作,VS2008自然要安装的,然后打上SP1的补丁.然 ...

  5. 利用VS2008编译器编译Qt4.8.2的MySQL驱动

    准备:安装VS2008和Qt 4.8.2,并且设置环境变量(QTDIR=C:\Qt\4.8.2 和 path+=C:\Qt\4.8.2\bin) 一.下载mysql数据库,安装(完全安装)到C盘根目录 ...

  6. 使用MSYS2环境中编译Qt5.5.0的补丁

    Qt的configure脚本对MinGW静态编译支持不太完善,总有这样那样的问题.如果你不嫌麻烦,而且可以接受高版本的Qt的话,可以考虑使用我做的补丁在MSYS2环境中编译.Qt5.4.2的补丁 Qt ...

  7. Java--自定义Class并且在内存中编译,加载,实例化

    本文的目的: 使用者在程序运行期间,可以动态的写Java Class,不需要生成任何.Class文件就可以完全在内存中编译,加载,实例化. 1.需要用到的组件介绍 1)JavaCompiler:用于编 ...

  8. 在PLSQL中编译复杂的java(转)

    原文地址:在PLSQL中编译复杂的java PLSQL中可以编译运行JAVA程序. 一个简单的例子: create or replace and compile java source named x ...

  9. 在VS2012中编译WinXP兼容的程序

    VS2012默认是不兼容Windows XP的,编译链接出来的程序只能在Windows Vista及以上版本的操作系统上运行.可是有时需要在Windows XP上运行,又不得不用VS2012(例如用了 ...

随机推荐

  1. POJ-2421-Constructing Roads(最小生成树 普利姆)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26694   Accepted: 11720 Description The ...

  2. ABAP CDS ON HANA-(12)ODATA Service

    Create a CDS view and we have the view type as ‘BASIC’ view To publish this as oData, add the annota ...

  3. python2.7入门---元组

        这次我们来学习下python中的元组.首先,基础认知点是,Python的元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号.元组创建很简单,只需要在括号中添加元素, ...

  4. ionic 打包apk Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]

    错误日志如下: Built the following apk(s): /Users/hongye0/Documents/project/haitoujiaApp/platforms/android/ ...

  5. git的关于测试的相关的内容

    今天,我们来讲一下git的分支的一些内容,在以前的时候,我一直都以为,对于一个项目,这个时候,我们把这个项目叫做项目a项目,这个a项目有master,staging,以及我自己的分支xxx,当我想上测 ...

  6. 三种urllib实现网页下载,含cookie模拟登陆

    coding=UTF-8 import re import urllib.request, http.cookiejar, urllib.parse # # print('-------------- ...

  7. WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法

    原文:WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法 问题描述 今天发现如果我想在一个TextBlock弄一个右键菜单,并且使用Command绑定,结果发 ...

  8. python 字典(dict)按键和值排序

    python 字典(dict)的特点就是无序的,按照键(key)来提取相应值(value),如果我们需要字典按值排序的话,那可以用下面的方法来进行: 1 下面的是按照value的值从大到小的顺序来排序 ...

  9. C++学习005-循环

    C++在循环方面,感觉个C没有身边么区别 while循环 for循环 do while循环 其实 使用Goto也可以写个循环 编写环境vs2015 1. while循环 int main() { in ...

  10. 序列化---fastjson使用

    该文章主要介绍com.alibaba.fastjson的使用. 首先创建maven工程,导入fastjson.挑个热度高的版本就好了. 首先考虑下,我们通常什么时候会使用序列化和反序列化: 1.将ja ...