windows平台vs2019编译v8小记
前言
-
编译v8除了参考笔者本篇文章,亦可参考Nuget的编译流程;
-
由于笔者需要v8可以兼容win7系统环境,所以使用了较为早期版本的v8分支:chromium-5414 (10.9-lkgr);
-
笔者使用vs2019环境,vs2022因为某些未知原因在我的环境中编译错误,可能是由于我使用的是较为早期版本的v8源码的原因?
参考资料
- v8-nuget
- 如何自己编译V8引擎
- 在windows下使用vs2022编译v8引擎的稳定版本(2023.7.22)
- depot_tools在windows上用遇到的问题和RTC编译出错
- VS2017链接V8引擎库遇到的一些问题
编译前准备
准备相关前置组件
- MSVC基本环境
Desktop Development with C++
C++ ATL for Latest v142 Build Tools (x86 & x64)
C++ MFC for Latest v142 Build Tools (x86 & x64)
C++ CMake tools for Windows
Windows 10 SDK(建议16299之后支持vs2019的全装上)
-
Google的源码管理工具(depot_tools)
下载地址:https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up -
添加环境变量
完成后大概长这样:
使用depot_tools拉取源码
-
找一个你想要的V8分支名字(我选择10.9-lkgr)
V8 Branch Details
大概长这样:
-
cmd管理员启动:
mkdir v8
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
fetch v8
cd v8
git checkout 10.9-lkgr
gclient sync -v
完成后大概长这样:
编译安装ninja(如果原来你就有,应该也能用)
此片段参考文献:在windows下使用vs2022编译v8引擎的稳定版本(2023.7.22)
编译开始
管理员打开cmd,进入v8根目录
大致如下图:
初始化cmd环境
根据你要编译x64还是x86以及vs版本,选择你的vs开发命令行,这里我用vs2019的Command Prompt
输入:
set DEPOT_TOOLS_WIN_TOOLCHAIN=0 (这句话每次打开命令行时都需要首先添加)
set GYP_MSVS_VERSION=2019 (根据实际情况,vs2022就填写2022)
静态库编译
- x64-debug-static
gn args out.lib/x64.debug (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.lib/x64.debug v8_monolith
配置字段:
v8_static_library=true
v8_monolithic=true
v8_enable_sandbox=true
v8_enable_disassembler=true
v8_enable_object_print=true
v8_use_external_startup_data=false
v8_enable_slow_dchecks=false
v8_enable_backtrace=true
v8_optimized_debug=false
v8_enable_i18n_support=true
v8_enable_webassembly=true
v8_symbol_level=0
enable_iterator_debugging=true
use_custom_libcxx=false
is_component_build=false
treat_warnings_as_errors=false
is_debug=true
is_clang=false
target_cpu="x64"
大致如下图:
- x64-release-static
点击查看代码
gn args out.lib/x64.release (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.lib/x64.release v8_monolith
配置字段:
v8_static_library=true
v8_monolithic=true
v8_enable_sandbox=true
v8_use_external_startup_data=false
v8_enable_disassembler=true
v8_enable_object_print=true
v8_enable_webassembly=true
v8_enable_i18n_support=true
v8_symbol_level=0
use_custom_libcxx=false
is_component_build=false
treat_warnings_as_errors=false
is_debug=false
is_clang=false
target_cpu="x64"
- x86-debug-static
点击查看代码
gn args out.lib/x86.debug (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.lib/x86.debug v8_monolith
配置字段:
v8_static_library=true
v8_monolithic=true
v8_enable_sandbox=false
v8_enable_disassembler=true
v8_enable_object_print=true
v8_use_external_startup_data=false
v8_enable_slow_dchecks=false
v8_enable_backtrace=true
v8_optimized_debug=false
v8_enable_webassembly=true
v8_enable_i18n_support=true
v8_symbol_level=0
enable_iterator_debugging=true
use_custom_libcxx=false
is_component_build=false
treat_warnings_as_errors=false
is_debug=true
is_clang=false
target_cpu="x86"
- x86-release-static
点击查看代码
gn args out.lib/x86.release (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.lib/x86.release v8_monolith
配置字段:
v8_static_library=true
v8_monolithic=true
v8_enable_sandbox=false
v8_use_external_startup_data=false
v8_enable_disassembler=true
v8_enable_object_print=true
v8_enable_webassembly=true
v8_enable_i18n_support=true
v8_symbol_level=0
use_custom_libcxx=false
is_component_build=false
treat_warnings_as_errors=false
is_debug=false
is_clang=false
target_cpu="x86"
动态库编译
- x64-debug-dynamic
点击查看代码
gn args out.dll/x64.debug (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.dll/x64.debug
配置字段:
v8_static_library=false
v8_monolithic=false
v8_enable_sandbox=true
v8_enable_disassembler=true
v8_enable_object_print=true
v8_use_external_startup_data=false
v8_enable_slow_dchecks=false
v8_enable_backtrace=true
v8_optimized_debug=false
v8_enable_i18n_support=true
v8_enable_webassembly=true
v8_enable_verify_heap=false
v8_symbol_level=0
enable_iterator_debugging=true
use_custom_libcxx=false
is_component_build=true
treat_warnings_as_errors=false
is_debug=true
is_clang=true
target_cpu="x64"
- x64-release-dynamic
点击查看代码
gn args out.dll/x64.release (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.dll/x64.release
配置字段:
v8_static_library=false
v8_monolithic=false
v8_enable_sandbox=true
v8_use_external_startup_data=false
v8_enable_disassembler=true
v8_enable_object_print=true
v8_enable_webassembly=true
v8_enable_i18n_support=true
v8_symbol_level=0
use_custom_libcxx=false
is_component_build=true
treat_warnings_as_errors=false
is_debug=false
is_clang=true
target_cpu="x64"
- x86-debug-dynamic
点击查看代码
gn args out.dll/x86.debug (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.dll/x86.debug
配置字段:
v8_static_library=false
v8_monolithic=false
v8_enable_sandbox=false
v8_enable_disassembler=true
v8_enable_object_print=true
v8_use_external_startup_data=false
v8_enable_slow_dchecks=false
v8_enable_backtrace=true
v8_optimized_debug=false
v8_enable_webassembly=true
v8_enable_i18n_support=true
v8_symbol_level=0
enable_iterator_debugging=true
use_custom_libcxx=false
is_component_build=true
treat_warnings_as_errors=false
is_debug=true
is_clang=true
target_cpu="x86"
- x86-release-dynamic
点击查看代码
gn args out.dll/x86.release (弹出的记事本底下添加配置字段,不要删除原来的,关闭后命令行会自动应用配置)
ninja -C out.dll/x86.release
配置字段:
v8_static_library=false
v8_monolithic=false
v8_enable_sandbox=false
v8_use_external_startup_data=false
v8_enable_disassembler=true
v8_enable_object_print=true
v8_enable_webassembly=true
v8_enable_i18n_support=true
v8_symbol_level=0
use_custom_libcxx=false
is_component_build=true
treat_warnings_as_errors=false
is_debug=false
is_clang=true
target_cpu="x86"
部分配置字段参考注解:
is_clang=true # 是否使用clang编译
is_debug=true # 是否debug编译
enable_iterator_debugging=true # debug模式需为true,否则 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” (这里参考文档:如何自己编译V8引擎 写反了,需要修正)
v8_enable_slow_dchecks=false # debug模式需为false,否则 error C3615: constexpr 函数不能生成常量表达v8_static_library=true # 编译静态库
v8_enable_disassembler=true # 打印
v8_enable_object_print=true # 打印
use_custom_libcxx=false # 用于静态库的话需要设为false
v8_use_external_startup_data=false # 避免外部文件依赖
is_clang=false # MSVC 编译
v8_enable_sandbox=true # 启用v8沙箱,加入项目需要添加V8_ENABLE_SANDBOX预处理宏
v8_enable_verify_heap=false # 修正在x64 Debug模式下编译的动态库在工程中链接出现VC++符号错误的问题
加入实际项目
-
将v8源码根目录下的include文件夹拷贝到你的包含目录
-
静态库编译v8需要加入项目的文件
添加到你的项目依赖库目录
./out.xx/obj/v8_monolith.lib
- 动态库编译v8需要加入项目的文件
添加到exe目录下的运行时二进制文件:
./out.xx/icudtl.dat
./out.xx/icui18n.dll
./out.xx/icuuc.dll
./out.xx/v8.dll
./out.xx/v8_libbase.dll
./out.xx/v8_libplatform.dll
./out.xx/zlib.dll
添加到你的项目依赖库目录
./out.xx/v8.dll.lib
./out.xx/v8_libbase.dll.lib
./out.xx/v8_libplatform.dll.lib
- x64下加入了v8沙箱和指针压缩,需要添加如下预处理宏:
V8_COMPRESS_POINTERS
V8_31BIT_SMIS_ON_64BIT_ARCH
V8_ENABLE_SANDBOX
-
项目代码生成需要使用 MTD/MT 模式
-
示例代码
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <list>
#include <map>
#include <array>
#include <memory>
#include <windows.h>
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "dbghelp.lib")
#pragma comment(lib, "shlwapi.lib")
#ifdef _V8_DLL_IMPORT // 使用动态库编译的v8库
#pragma comment(lib, "v8.dll.lib")
#pragma comment(lib, "v8_libbase.dll.lib")
#pragma comment(lib, "v8_libplatform.dll.lib")
#else // 使用静态库编译的v8库
#pragma comment(lib, "v8_monolith.lib")
#endif
#include "libplatform/libplatform.h"
#include "v8-context.h"
#include "v8-debug.h"
#include "v8-initialization.h"
#include "v8-inspector.h"
#include "v8-isolate.h"
#include "v8-local-handle.h"
#include "v8-primitive.h"
#include "v8-script.h"
#include "v8-template.h"
#include "v8.h"
std::unique_ptr<v8::Platform> g_platform;
bool bInitializeV8EngineApp = false;
void InitializeV8EngineApp() {
if (bInitializeV8EngineApp) {
return;
}
bInitializeV8EngineApp = true;
v8::V8::SetFlagsFromString("--gc-interval 3000000 --stack-trace-limit 10 ");
g_platform = v8::platform::NewDefaultPlatform(2, v8::platform::IdleTaskSupport::kEnabled);
v8::V8::InitializePlatform(g_platform.get());
if (!v8::V8::Initialize()) {
std::cout << "v8 Initialize failed " << std::endl;
return;
}
std::cout << "v8 version: " << v8::V8::GetVersion() << std::endl;
}
int main(void) {
InitializeV8EngineApp();
return 0;
}
输出如下图:
本文为博主总结文章,欢迎转载,请注明出处。