windows_v8引擎编译过程记录(保姆级教程)

0.环境配置

1.Python3

省略

2.Git

省略

3.VS2022

需要安装这些东西,最重要的是windowsSDK找到对应windows10的版本,同理win11也是找win11的版本。

image-20251224154019458

完成后关闭Visual Studio Installer,在Windows搜索栏搜索添加或者删除程序

图片

搜索Windows Software Development Kit.找到我们的版本,点击修改

图片

选择Change,然后点击Next

图片

勾上Debugging Tools for Windows,点击Change

图片

完成后关闭窗口

1.下载v8项目源代码

找到一个合适的地方创建空文件夹v8,打开cmd,设定工作目录到v8文件夹

运行命令配置代理,根据代理工具的端口修改

1
2
3
4
5
git config --global http.proxy http://192.168.113.1:7890
git config --global https.proxy http://192.168.113.1:7890

set HTTP_PROXY=http://192.168.113.1:7890
set HTTPS_PROXY=https://192.168.113.1:7890

我们先设置一个环境变量,不然谷歌的工具不会下载Windows相关的工具

set DEPOT_TOOLS_WIN_TOOLCHAIN=0

确保你的代理设置完毕,在cmd运行以下命令拉取源代码

fetch v8

拉取比较费时间,哪怕你的代理能到10MB/s也要几分钟才能拉取完

如果你注意到进度一直都没动,说明可能你的PATH环境变量有问题。

2.下载开发工具depot_tools

使用

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

下载对应的depot_tools文件,最好是在盘符的根目录下,例如G:depot_tools\

然后把文件夹路径添加到PATH环境变量里面

需要确保Python已经安装,并且Python的安装目录在环境变量里面

注意:depot_tools要在所有其它路径之前。

3.编译v8依赖和同步版本

我们回到设置了代理的那个cmd窗口,进入到v8目录下的v8目录,也就是G:v8\v8\

cd v8

设置环境变量

1
set DEPOT_TOOLS_WIN_TOOLCHAIN=0

接着转换版本到对应的commit或者版本号

git checkout 609a85c2a1bd77d6f6905369f4bc4fcf34c5db09

然后再次确保你的代理设置完毕,并且确保你的cmd执行过开头的环境变量设置命令,运行以下命令完成依赖处理

1
gclient sync -D

这一步可能会下载一些依赖,没有看到报错就说明成功了,我们进入下一步

如果这一步报错,八成是忘记了设置环境变量set DEPOT_TOOLS_WIN_TOOLCHAIN=0

4.编译安装ninja

找一个合适的地方,然后git克隆ninja项目,我是直接在E盘根目录搞

git clone https://github.com/ninja-build/ninja.git

图片

然后进入ninja项目文件夹,调用git检出release

1
2
cd ninja
git checkout release

接下来打开vs的开发人员命令提示符Developer Command Prompt for VS 2022

图片

如下图,进入ninja项目文件夹,运行下面的命令编译ninja

1
python configure.py --bootstrap

运行完成后就能看到ninja.exe在ninja项目文件夹里面

直接把它移动到之前下载解压的depot_tools目录下

图片

5..编译v8 x64 release

动态库

回到cmd窗口,在v8\v8目录下

现在我们不需要代理,先去关闭系统全局代理,然后运行下面的命令关闭git和命令行的代理

1
2
3
4
5
git config --global --unset http.proxy
git config --global --unset https.proxy
netsh winhttp reset proxy
set HTTP_PROXY=
set HTTPS_PROXY=

再次设置环境变量,防止自己不小心关闭cmd窗口忘记了设置

set DEPOT_TOOLS_WIN_TOOLCHAIN=0

设置编译信息,动态库编译模式

1
python3 tools\dev\v8gen.py x64.release -vv -- is_component_build=true v8_static_library=false

配置生成成功了

图片

使用ninja编译

ninja -C out.gn\x64.release

然后这个过程CPU会吃满,最好不要干其它事情。

跑完要个十几分钟,耐心等待。

图片

跑完后我们进入v8\v8\out.gn\x64.release\文件夹

往下翻能找到d8.exe,打开看看正不正常

图片

图片

随便输入一串js代码看看结果

console.log("test"+4*8),5*7;

输出test32,返回35,说明编译的很成功

在别的地方创建个文件夹,先复制出运行时:

1
2
3
4
5
6
7
8
9
10
d8.exe
icudtl.dat
icui18n.dll
icuuc.dll
libc++.dll
snapshot_blob.bin
v8.dll
v8_libbase.dll
v8_libplatform.dll
zlib.dll

这就是动态版本v8程序运行所需的dll,运行d8.exe发现可以正常运行(路径包含中文会导致无法双击运行)

注:d8.exe仅供测试,它并不是运行v8所必须的

我们如果用动态方法调用v8,还需要dll文件对应的lib,所以说再创建个lib文件夹,复制出以下文件:

1
2
3
v8.dll.lib
v8_libbase.dll.lib
v8_libplatform.dll.lib

静态库

回到v8\v8,我们删除out.gn文件夹

如果之前的cmd被关闭了,运行set DEPOT_TOOLS_WIN_TOOLCHAIN=0设置环境变量

在v8\v8下运行以下命令生成静态编译配置

1
python3 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 is_clang=true

使用ninja编译

1
ninja -C out.gn\x64.release v8_monolith

和动态库编译一样,这个过程也耗时,耐心等待编译完成

期间会出现很多注意:包含文件:的提示,忽略即可

跑完后我们进入v8\v8\out.gn\x64.release\obj文件夹

仔细寻找可以看到v8_monolith.lib,这个就是我们要的lib静态库了,大约280MB

6.编译v8 x64 debug

动态版本

回到v8\v8,我们删除out.gn文件夹

如果之前的cmd被关闭了,运行set DEPOT_TOOLS_WIN_TOOLCHAIN=0设置环境变量

生成配置

1
python3 tools\dev\v8gen.py x64.debug -vv -- is_component_build=true v8_static_library=false

编译

1
ninja -C out.gn\x64.debug

在别的地方创建个文件夹,复制出以下文件作为运行时:

1
2
3
4
5
6
7
8
9
10
d8.exe
icudtl.dat
icui18n.dll
icuuc.dll
libc++.dll
snapshot_blob.bin
v8.dll
v8_libbase.dll
v8_libplatform.dll
zlib.dll

复制出以下文件作为lib:

1
2
3
v8.dll.lib
v8_libbase.dll.lib
v8_libplatform.dll.lib

运行d8.exe发现正常运行(路径包含中文会导致无法双击运行)

注:d8.exe仅供测试,它并不是运行v8所必须的

静态版本

回到v8\v8,我们删除out.gn、out文件夹

如果之前的cmd被关闭了,运行set DEPOT_TOOLS_WIN_TOOLCHAIN=0设置环境变量

生成Debug版本需要另一个方法来配置

先运行

1
gn args out/x64.debug

这个时候会自动弹出一个记事本,我们不要关闭它

图片

往记事本里面输入这些

1
2
3
4
5
6
7
8
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=true
is_debug=true

然后我们Ctrl+S保存,然后关闭记事本窗口

等待一会,可以看到进度跑完了

图片

用下面的命令编译

1
ninja -C out/x64.debug v8_monolith

和动态库编译一样,这个过程也耗时,耐心等待编译完成

期间会出现很多注意:包含文件:的提示,忽略即可

跑完后我们进入v8\v8\out\x64.debug\obj文件夹

仔细寻找可以看到v8_monolith.lib,这个就是我们要的lib静态库了,大约450MB

7.编译v8 ia32

注:ia32又称x86,也就是32位版本

release版本

动态

1
2
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
python3 tools\dev\v8gen.py ia32.release -vv -- is_component_build=true v8_static_library=false

运行命令编译

1
ninja -C out.gn\ia32.release

静态

运行命令生成配置

1
2
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
python3 tools\dev\v8gen.py ia32.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 is_clang=true

使用ninja编译

1
ninja -C out.gn\ia32.release v8_monolith

debug版本

动态

1
2
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
python3 tools\dev\v8gen.py ia32.debug -vv -- is_component_build=true v8_static_library=false

编译

1
ninja -C out.gn\ia32.debug

静态

运行命令生成配置

1
gn args out/ia32.debug

这个时候会自动弹出一个记事本,往记事本里面输入这些

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=true
is_debug=true
target_cpu = "x86"

编译

1
ninja -C out/ia32.debug v8_monolith