chrome V8 編譯實錄


    chrome V8作為最好的Javascript解釋器之一,利用它做基於JS語言的小程序想必很有趣。經過查閱相關資源(詳見隨筆底部)及通宵嘗試,終於編譯成功並實現第一個小程序。

    有一點想不通的是,為什么google僅提供源代碼,而不提供已編譯好的lib、dll文件呢?本人並不喜歡這么復雜繁瑣的編譯過程。

    本文僅將自己的理解、編譯過程和報錯問題分享出來,防止網友再走同樣的冤枉路,引用文章已在下面列出,有不當地方歡迎高手拍磚。

    目前,在Windows有兩種編譯方式:

        1. 通過 GYP(Generate Your Project) 生成項目文件(sln)的方式,也是google推薦的方式,這樣可通過Visual Studio查看編譯不同項目;

        2. 通過 Scons build的方式,個人覺得它更方便,但google稱未來將不再使用它。

   

    第一部分:搭建環境

    這里僅分享Windows平台下的環境配置:

        1. Visual Studio IDE。原理上它支持05/08以及2010,但在2010下GYP方式我未成功,可能由於它對項目文件進行轉換造成的吧,原因不詳,請高手指點。總之建議用VS2008,因為官網給出08下的命令。請大家一定看清是否安裝了VS對VC++的支持,最初編譯失敗就因為本機僅安裝對C#的支持造成的。另外要安裝SP1包。

        (下面會用到SVN和GIT,未安裝的朋友需要裝一下:tortoriseSVN  Git

        2. Python環境。最初裝3.2,編譯過程報錯,我想可能由於3.2安裝后文件夾為Python32有關,所以最后改為Python 2.7,成功。

            可以通過Python官網下載安裝包,也可以通過SVN checkout一份,地址為 svn co http://src.chromium.org/svn/trunk/tools/third_party/python_26@89111 third_party/python_26

            最后在環境變量Path上添加 C:\Python27;C:\Python27\Scripts ,我的目錄為C盤。

        3. GYP或Scons。V8官網已經建議安裝GYP,並利用其生成的項目文件進行編譯,由於我本機環境是Visual Studio 2010,該方式下總是報錯缺少文件,所以又安裝了Scons,並編譯成功。

            關於GYP,V8官網給的SVN命令 svn co http://gyp.googlecode.com/svn/trunk build/gyp 總是checkout不下來,提示URL鏈接錯誤,后發現googlecode.com訪問不了,本人隨后在git上下載了一份 https://github.com/martine/gyp

           關於Scons,本人覺得它確實是編譯C/C++項目較好的工具之一,使用方便,地址為 http://www.scons.org/download.php ,但V8官網已經在推薦google自己的GYP,另外編譯過程也加了提示。

 

        4. cygwin。必裝軟件,遇到同上的問題。V8官網提供的SVN命令 svn co http://src.chromium.org/svn/trunk/deps/third_party/cygwin@66844 third_party/cygwin 總是checkout不成功,后在cygwin官網下了一份,發現其國內鏡像首選是網易開源鏡像站,贊一個!!

        5. 下載V8引擎源代碼。本人通過官網提供 GIT 地址 git clone git://github.com/v8/v8.git v8 && cd v8 成功下載。

            現在的源代碼都是不提供項目文件sln,如果想用VS打開,就必須用GYP生成。

 

    第二部分:編譯過程

        一、若使用GYP,那么首先要使用Python安裝,在命令行下轉到GYP所在目錄,鍵入命令 python setup.py install  安裝,完成后Python會增加scripts目錄。

             命令行轉到V8所在目錄,執行 python build\gyp_v8 ,將會在該目錄下生成All.sln項目文件。

             最后使用VS編譯源代碼,可以使用命令行 "c:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com"/build Release build\All.sln ,也可以用IDE打開sln項目文件編譯生成。

             郁悶的是,在VS2010下需要進行轉換,在命令行下會報如下提示。郁悶許久!!

        二、使用Scons是我最后的選擇,感覺也非常方便。

            若未設置環境變量則需要加上 set PATH=C:\Python27;C:\Python27\Scripts;%PATH%

             設置運行VC++2010的環境 "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"

             命令行下轉到V8所在目錄,調用scons命令進行編譯

                     動態模式   scons mode=release library=shared msvcrt=shared env="PATH:%PATH%,LIB:%LIB%,INCLUDE:%INCLUDE%" d8

                                   scons mode=debug library=shared msvcrt=shared env="PATH:%PATH%,LIB:%LIB%,INCLUDE:%INCLUDE%" d8          

                     使用靜態模式 library=static 會產生較大lib文件(>200M),而且編譯時間長,總出錯。。

             等待編譯...最后在V8根目錄將會看到生成的V8.lib V8.dll等文件(如果中間出錯中止,請嘗試再次編譯,我遇到多次,但再次編譯就沒問題了)

        注:國外一篇博客中高手直接將所有功能做了打包,下載后執行腳本直接可生成dll文件,親測正確!地址見 參考文章6。

   

    第三部分:第一個V8程序

    編譯成功后,參考官網的Hello World程序,檢驗一下編譯成果。

    1. VS2010下,新建Win32 Console Application,添加對v8.h 和v8.lib的引入。

 

    2. 貼入代碼片段

    注意別忘記引入 WSock32.lib、ws2_32.lib、winmm.lib  三個lib,否則會報錯滴!!

View Code
 1 #include <v8.h>
 2 #pragma comment(lib,"WSock32.lib")
 3 #pragma comment(lib,"ws2_32.lib")
 4 #pragma comment(lib,"winmm.lib")
 5 using namespace v8;
 6 
 7 int _tmain(int argc, _TCHAR* argv[]){
 8     // Create a stack-allocated handle scope.
 9     HandleScope handle_scope;
10     int m;
11     // Create a new context.
12     Handle<Context> context = Context::New();
13     // Enter the created context for compiling and
14     // running the hello world script.
15     Context::Scope context_scope(context);
16     // Create a string containing the JavaScript source code.
17     Handle<String> source = String::New("'Hello' + ', World!'");
18     // Compile the source code.
19     Handle<Script> script = Script::Compile(source);
20     // Run the script to get the result.
21     Handle<Value> result = script->Run();
22     // Convert the result to an ASCII string and print it.
23     String::AsciiValue ascii(result);
24     printf("%s\n", *ascii);
25     scanf("%d",m);
26 
27     return 0;
28 }

    3. 看到控制台輸出 Hello World! 搞定

 

    參考文章:

        1. http://code.google.com/p/v8/wiki/BuildingWithGYP

        2. http://www.cnblogs.com/meteoric_cry/archive/2011/03/14/1983294.html

        3. http://www.cnblogs.com/foxhengxing/archive/2011/07/11/2103430.html

        4. http://funnylog.kr/351

        5. http://blog.stevenreid.co.uk/2011/06/25/build-v8-on-windows-7/

        6. http://blog.carsten.orthbandt.de/?p=132

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM