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/