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,否則會報錯滴!!

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
5. http://blog.stevenreid.co.uk/2011/06/25/build-v8-on-windows-7/
6. http://blog.carsten.orthbandt.de/?p=132