1. 程式人生 > >webkit在vs2008中編譯

webkit在vs2008中編譯

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

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

image

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依賴最小,而且不會出現我們現在遇到的問題。

三。cairo版的webkit依賴較小(起碼不依賴蘋果閉源的幾個庫),應該可以在vs2008裡面編譯和執行。

 

參考文章:

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

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述