0%

Windows 编译 V8 静态库踩坑记录

V8 编译步骤及踩坑记录。

环境准备

  • 科学的网络环境

  • Visual Studio 2019 使用 C++ 的桌面开发

    • Windows 10 SDK 10.0.19041.0 以上

    • Windows SDK Debugging Tools (到设置中修改安装)

  • Git

  • Python

步骤

获取 depot_tools

如果有代理:

1
2
> set HTTP_PROXY=代理地址
> git config --global http.proxy=代理地址

拉代码:

1
> git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

并把 depot_tools 目录添加到 PATH 环境变量。

设置 DEPOT_TOOLS_WIN_TOOLCHAIN 环境变量值为 0

设置 vs2019_install 环境变量值为 VS 安装路径如 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community

更新 depot_tools 依赖

然后:

1
> gclient

坑 1:需要科学的网络环境,而且不会有任何输出,网速慢会耗时很久,静默下载的东西会出现在 depot_tools 根目录下,耐心等吧。

获取 V8 源码

1
2
3
4
> mkdir C:\v8
> cd C:\v8
> fetch --nohooks v8
> cd .\v8

坑 2:同样需要科学的网络环境,网速慢会耗时很久,而且仓库七百八 M 很大,这一步很容易中断,中断后重新拉:

1
C:\v8> gclient sync --nohooks

拉完代码以后检出到想构建的分支或标签后还要再跑 gclient sync,这一次同步应该不会太久。

1
2
C:\v8\v8> git checkout 8.6.51
C:\v8\v8> gclient sync --nohooks

坑 2.1:如果加了 --nohooks 选项,同步以后不会跑 hooks,导致有些东西缺失:

缺少最后更新信息:

1
C:\v8\v8> python .\build\util\lastchange.py .\build\util\LASTCHANGE

不存在 third_party\llvm-build\Release+Asserts\bin\clang-cl.exe

1
C:\v8\v8> python .\tools\clang\scripts\update.py

坑 2.1.1:同样需要科学的网络环境,可以用其他手段把输出的压缩包地址下载下来,手动解压到 third_party\llvm-build\Release+Asserts

编译静态库

到这里就不用科学的网络环境了,所有工具链已经准备完毕。

生成 ninja 配置:

1
C:\v8\v8> python .\tools\dev\v8gen.py x64.release -- 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

也可以手动把参数写进 out.gn\x64.release\args.gn

1
2
3
4
5
6
7
8
is_debug = false
target_cpu = "x64"
is_component_build = false
use_custom_libcxx = false
v8_monolithic = true
v8_use_external_startup_data = false
treat_warnings_as_errors = false
v8_symbol_level = 0

编译:

1
C:\v8\v8> ninja -C .\out.gn\x64.release v8_monolith -j 14

坑 3:不加 treat_warnings_as_errors=false 会报错编译失败,不加 v8_symbol_level=0 编译出来的静态库差不多 800M 的大小。

等个十分钟左右,输出 out.gn\x64.release\obj\v8_monolith.lib

构建 Hello World 示例

v8_monolith.libv8\include 复制出来

包含目录要把复制出来的 v8\include 加进去,预定义好 V8_COMPRESS_POINTERS,库要包含 Dbghelp.libwinmm.lib