win10编译v8引擎

记录在win10编译v8过程。

编译环境

参考网址 可以单独通过git从github下载v8引擎源码,官方推荐使用depot_toos下载源码,因此本文使用depot_tools下载拉去v8源码。

设置代理

因为v8源码在外网上,默认不能访问,因此需要配置一个代理。
打开window控制台,设置代理信息

1
2
3
@echo off
set HTTP_PROXY=http://127.0.0.1:8293
set HTTPS_PROXY=http://127.0.0.1:8293

下载depot_tools

下载depot_tools压缩包, 或者使用git clone下来 git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
然后配置环境变量, 添加depot_tools目录到环境变量path中

安装window 10 sdk

编译v8在window上需要window sdk, 当前在win10上编译v8需要最新window sdk版本为10.0.20348.0, 下载网址,下载完成安装。

下载v8 源码

打开控制台,进入指定目录创建v8目录,然后进入v8目录后执行fetch v8获取v8源码

1
2
3
4
cd c:\home
mkdir v8
cd v8
fetch v8

编译步骤

打开控制台,进入v8目录,使用gn生成编译文件

1
cd c:\home\v8\v8

编译32位v8程序

通过gn生成编译环境后需要修改对应目录下的args.gn文件,修改对应的target_cpu类型(x86)

编译debug版

1
2
3
4
gn args out/x86.debug
#执行完后需要修改args.gn文件,然后执行ninja编译

ninja -C out\x86.debug v8_monolith

编译release版

1
2
3
4
gn args out/x86.release
#执行完后需要修改args.gn文件,然后执行ninja编译

ninja -C out\x86.release v8_monolith

args.gn文件内容

文件路径路径: c:\home\v8\v8\out\x86.release\args.gn

1
2
3
4
5
6
7
8
9
v8_monolithic=true 
v8_use_external_startup_data=false
use_custom_libcxx=false
is_component_build=false
treat_warnings_as_errors=false
v8_symbol_level=0
is_clang=false
is_debug=false #是否debug
target_cpu="x86" #目标cpu类型

编译64位v8程序

编译debug版

1
2
3
4
gn args out/x64.debug
#执行完后需要修改args.gn文件,然后执行ninja编译

ninja -C out\x64.debug v8_monolith

编译release版

1
2
3
4
gn args out/x64.release
#执行完后需要修改args.gn文件,然后执行ninja编译

ninja -C out\x64.release v8_monolith

args.gn文件内容

文件路径路径: c:\home\v8\v8\out\x64.release\args.gn

1
2
3
4
5
6
7
8
9
v8_monolithic=true 
v8_use_external_startup_data=false
use_custom_libcxx=false
is_component_build=false
treat_warnings_as_errors=false
v8_symbol_level=0
is_clang=false
is_debug=false #是否debug
target_cpu="x64" #目标cpu类型

c++样例

需要注意的是初始化v8的时候,必须填充当前程序的路径,否则会出现异常.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
void CJavaScriptEngine::TestFunction() {
TCHAR szCurrentDir[MAX_PATH] = { 0 };
GetModuleFileName(NULL, szCurrentDir, sizeof(szCurrentDir));
SStringT exePath(szCurrentDir);
SStringA exePath1 = S_CW2A(exePath);
// Initialize V8.
v8::V8::InitializeICUDefaultLocation(exePath1.c_str());
v8::V8::InitializeExternalStartupData(exePath1.c_str());
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();

// Create a new Isolate and make it the current one.
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
v8::Isolate::Scope isolate_scope(isolate);

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

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

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

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

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

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

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

{
// Use the JavaScript API to generate a WebAssembly module.
//
// |bytes| contains the binary format for the following module:
//
// (func (export "add") (param i32 i32) (result i32)
// get_local 0
// get_local 1
// i32.add)
//
const char csource[] = R"(
let bytes = new Uint8Array([
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0x01,
0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07,
0x07, 0x01, 0x03, 0x61, 0x64, 0x64, 0x00, 0x00, 0x0a, 0x09, 0x01,
0x07, 0x00, 0x20, 0x00, 0x20, 0x01, 0x6a, 0x0b
]);
let module = new WebAssembly.Module(bytes);
let instance = new WebAssembly.Instance(module);
instance.exports.add(3, 4);
)";

// Create a string containing the JavaScript source code.
v8::Local<v8::String> source =
v8::String::NewFromUtf8Literal(isolate, csource);

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

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

// Convert the result to a uint32 and print it.
uint32_t number = result->Uint32Value(context).ToChecked();
printf("3 + 4 = %u\n", number);
}
}

// Dispose the isolate and tear down V8.
isolate->Dispose();
v8::V8::Dispose();
v8::V8::DisposePlatform();
delete create_params.array_buffer_allocator;
}
文章目录
  1. 1. 编译环境
    1. 1.1. 设置代理
    2. 1.2. 下载depot_tools
    3. 1.3. 安装window 10 sdk
    4. 1.4. 下载v8 源码
  2. 2. 编译步骤
    1. 2.1. 编译32位v8程序
      1. 2.1.1. 编译debug版
      2. 2.1.2. 编译release版
      3. 2.1.3. args.gn文件内容
    2. 2.2. 编译64位v8程序
      1. 2.2.1. 编译debug版
      2. 2.2.2. 编译release版
      3. 2.2.3. args.gn文件内容
  3. 3. c++样例