mac osx下编译v8

v8相信大家都不陌生,本文将介绍一下,如何在mac osx下编译v8,并用一个例子来试验编译结果。

编译

首先获取一下源代码,v8在github上有镜像,可以直接clone github上的。

1
git clone https://github.com/v8/v8.git

代码量较大,请耐心等待…

下载完成后,我们还需要下载编译前的依赖。

1
make builddeps

Note: 以上命令都比较悲剧,因为要跨越我朝的墙…建议使用vpn吧,用goagent也可以,不过会很慢。

依赖下载完成之后,我们就可以正式build了:

1
make

更多编译选项,请查看官网

编译完成之后,在out目录下会生成类似以下目录:

  • out/ia32.release
  • out/ia32.debug
  • out/x64.release
  • out/x64.debug

按照平台划分,我的机器是x64,debug与release也有一些区别,比如log以及一些新特性等

我们以x64.debug为例,在该目录下,有一些可执行文件,比如d8,这个可执行文件可用来直接在命令行下运行javascript(当然,不包括dom、bom等)。

1
./d8

运行d8后,就会进入一个可交互的shell环境,可执行js,例如:

1
2
d8> 1 + 2
3

例子

out/x64.debug下,除了一些可执行文件外,还生成了一些静态链接库,比如:

  • out/x64.debug/libv8_base.a
  • out/x64.debug/libv8_libbase.a

这些文件在编译v8一些例子的时候,需要链接进来。

我们来编译一下官网的Hello World例子,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <v8.h>

using namespace v8;

int main(int argc, char* argv[]) {
// Create a new Isolate and make it the current one.
Isolate* isolate = Isolate::New();
Isolate::Scope isolate_scope(isolate);

// Create a stack-allocated handle scope.
HandleScope handle_scope(isolate);

// Create a new context.
Local<Context> context = Context::New(isolate);

// Enter the context for compiling and running the hello world script.
Context::Scope context_scope(context);

// Create a string containing the JavaScript source code.
Local<String> source = String::NewFromUtf8(isolate, "'Hello' + ', World!'");

// Compile the source code.
Local<Script> script = Script::Compile(source);

// Run the script to get the result.
Local<Value> result = script->Run();

// Convert the result to an UTF8 string and print it.
String::Utf8Value utf8(result);
printf("%s\n", *utf8);
return 0;
}

链接静态库,编译HelloWorld.cc:

1
2
3
4
5
6
7
8
clang++ -I./include samples/HelloWorld.cc -o ./out/HelloWorld \
-Wl, ./out/x64.debug/libv8_base.a \
-Wl, ./out/x64.debug/libv8_libbase.a \
-Wl, ./out/x64.debug/libicui18n.a \
-Wl, ./out/x64.debug/libicudata.a \
-Wl, ./out/x64.debug/libicuuc.a \
-Wl, ./out/x64.debug/libv8_snapshot.a \
-stdlib=libstdc++

注意最后的stdlib参数,最新版的mac使用的是llvm编译器,其默认的标准库是libc++,但v8依赖的是libstdc++

编译完成后,在out目录下就生成了可执行文件HelloWorld:

1
2
$ ./HelloWorld
Hello World!

大功告成!

网上其实有很多类似的v8编译博文,不过大部分都是比较老的文章,最新版的编译方式还不大一样,希望本文对您有所帮助!