windows平台vs2019编译v8小记

前言

  1. 编译v8除了参考笔者本篇文章,亦可参考Nuget的编译流程;

  2. 由于笔者需要v8可以兼容win7系统环境,所以使用了较为早期版本的v8分支:chromium-5414 (10.9-lkgr)

  3. 笔者使用vs2019环境,vs2022因为某些未知原因在我的环境中编译错误,可能是由于我使用的是较为早期版本的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的全装上)

使用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;
}

输出如下图:
图例

posted @ 2024-04-12 15:35  倚剑问天  阅读(216)  评论(0编辑  收藏  举报