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

 

posted @ 2012-08-13 17:04  New Wayne  阅读(5787)  评论(0编辑  收藏  举报