星期三, 三月 13, 2013

Google V8 在 Window 7和mingw 环境下编译通过

首先 V8 Javascript 官方不支持mingw环境,所以编译开始就要有心理准备肯定会有一些错误,一般是在link的时候出现;
一般通过修改相关配置文件的命令行选项可以纠正之。

其次,出现 undefined reference to vtable for XXXX的link错误提示,vtable是c++用来处理虚函数编译器算法,可以参看

Virtual method table - Wikipedia, the free encyclopedia


所以出现这种提示,2种可能,
1.虚函数方法没有实现,只是在.h头部文件中声明而已。
2.实现虚函数的.cc文件没有放到link命令行内。

1.首先下载最新的V8 Javascript源代码(必须首先安装上svn工具)
svn checkout http://v8.googlecode.com/svn/trunk/ v8
注意:
http://v8.googlecode.com/svn/branches/ 这个目录下是用于Google浏览器的稳定版本,可以下载最大数字的版本编译svn checkout http://v8.googlecode.com/svn/branches/3.16/ v8_316
2.进入v8 目录 cd v8,然后准备新的Google v8 编译管理工具 gyp
 
svn co http://gyp.googlecode.com/svn/trunk build/gyp

然后运行:
python build\gyp_v8 --generator-output="out" -Dv8_target_arch=ia32

注意:如果是使用msvc可以告之gyp使用的visual studio express 版本:

python build\gyp_v8 -G msvs_version=2010 --generator-output="out" -Dv8_target_arch=ia32

最后开始编译并声称v8.dll和libv8.a文件
scons.py  arch=ia32 os=win32 toolchain=gcc library=shared I_know_I_should_build_with_GYP=yes

如果最后link出现了vtable 错误,就寻找包含的方法在那个.cc文件,编译并手动生成v8.dll和libv8.a

目前这个版本会有3个文件在mingw下编译有3个文件被遗漏了
1.code-stubs-hydrogen.cc
2.sweeper-thread.cc
3.marking-thread.cc

通过命令行:
g++ -o obj\release\marking-thread.o -c -fno-rtti -fno-exceptions -DWIN32 -Wall -Werror -W -Wno-unused-parameter -Woverloaded-virtual -Wnon-virtual-dtor -pedantic -Wno-long-long -Wno-pedantic-ms-format -m32 -O3 -fomit-frame-pointer -fdata-sections -ffunction-sections -DWIN32 -DV8_TARGET_ARCH_IA32 -DENABLE_DEBUGGER_SUPPORT -Isrc src\marking-thread.cc

分别生成这.o文件在obj\release下之后,将其加入到最后生成 v8.dll和libv8.a的命令中,即可生成动态库.

V8的shell d8目前只有依赖msvc 生成,要编译生成d8.exe用来调试javascript程序,
还必须要下载 第三方的包,
在v8 或v8_316目录下:
1.svn co http://src.chromium.org/svn/trunk/deps/third_party/cygwin@66844 third_party/cygwin
2.svn co http://src.chromium.org/svn/trunk/tools/third_party/python_26@89111 third_party/python_26

这两个包用来msvc用来生成snapshot.lib的过程中,必须的。

至此即可用v8 Engine嵌入自己的程序来使用了。

v8 支持Android.