转载自: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. windows 安装 .net core 环境

    windows 安装 环境说明 window10系统 .net core 1.0.1 visual studio code 安装 .net core Windows系统下安装软件基本上属于傻瓜式安装, ...

  2. python2.7练习小例子(十七)

        17):题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制.     程序分析: ...

  3. python2.7入门---循环语句(for&嵌套循环)

        咱们直接先来看for循环.Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串.然后再来看一下它的语法结构: for iterating_var in sequence: ...

  4. linux c fgetc()

    今天练习代码的时候碰见这样一个问题: 一个文件test.txt,文件内容为 1 2 4 5 在程序中读写这个文件,修改其内容,添加一行,将文件内容变成: 1 2 3 4 5 楼主的错误代码是这样的: ...

  5. java性能测试工具 jprofiler

    1.下载地址 官方网址:http://www.ej-technologies.com/products/jprofiler/overview.html 2.Eclipse集成 该文(http://ji ...

  6. C#的特性Attribute

    一.什么是特性 特性是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签,这个标签可以有多个.您可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它 ...

  7. 【转】使用git提交项目到码云

    一.git安装 1.首先在官方网站下载git工具,或者根据以下链接进行下载:http://download.csdn.net/detail/qq_27501889/9788879(此链接版本为git- ...

  8. centos redis 安装 php-redis扩展安装 及使用

    前提:centos7.php7 安装redis-server 1:yum install redis 编译安装php-redis 扩展 1:下载编译安装 wget https://codeload.g ...

  9. 【题解搬运】PAT_A1020 树的遍历

    题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...

  10. ubuntu 把软件源修改为国内源

    国内有很多Ubuntu的镜像源,比如:阿里源.网易源等,还有很多教育网的源,比如:清华源.中科大源等. 这里以清华源为例讲解如何修改Ubuntu 18.04里面默认的源. 修改步骤 第一步:备份原始源 ...