我是靠谱客的博主 鲜艳鸡翅,最近开发中收集的这篇文章主要介绍编译V8引擎,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

由于项目项目中最近用到v8引擎,项目由sparkmonkey切换到v8后,性能有了较大的提升,不过美中不足的是,启动时间较长,查看v8相关的文档,可以使用snapshot快照技术加快启动速度,因此觉得自己编译v8,加速启动。

在编译过程中遇到各种问题,首先说编译环境,项目需求是在android中使用v8快照,一般生成android平台的v8链接库有三种形式,在windows环境编译,在windows环境下使用cgwin编译,在linux环境下编译。

  • 使用window环境编译

    v8最新版本会强制绑定到vs2017,就算指定仅编译android平台也不能拿避免,没有装vs2017,目前项目使用vs2015,升级设计比较多的人,故舍弃此方案。(可能有其他参数避免这种绑定,不了解暂时没有深究)

  • 使用window环境下cgwin编译

    在cgwin环境下前期正常,但在相关脚本的调用中,遇到一个路径中斜杠””和反斜杠”/”的报错,由于关联脚本是从远程库自动下载,无法本地修改,如果要一一修改,需要将脚本加入到本地索引中,因此也没有使用这种方案。

  • 使用linux环境编译

    使用linux环境编译目前遇到问题最少,基本都是自动脚本执行完成,linux中还缺少部分系统库,手动添加一下就好。

开始编译v8,分为三个部分,第一个准备环境,linux使用虚拟机wmware,装centos最新稳定版本,注意硬盘要分配30G以上,因为要下载ndk以及一大堆第三方代码,建议留足编译空间。

  • 前期准备

    装完centos后,先需要安装gcc gcc-c++

    yum install -y gcc
    yum install -y gcc-c++

    安装depot_tools,主要用来下载脚本,有两个工具 fetch,gclient

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

    修改系统环境变量,将depot_tools加入到系统命令当中

    vim /etc/profile
    ...
    export PATH=/*(目录)/depot_tools:$PATH

    编译可以使用fetch v8来默认编译,这条命令相当于先建立一个默认的.gclient配置描述文件,然后再指向gclient sync下载相关依赖项目,我们可以采用自己建立.gclient文件定制下载选项

    gclient config https://github.com/v8/v8.git

    这个时候,在当前工作目录下会生成一个.gclient文件,使用编辑器打开它

    solutions = [
      { "name"        : "v8",
        "url"         : "https://github.com/v8/v8.git",
        "deps_file"   : "DEPS",
        "managed"     : True,
        "custom_deps" : {
        },
      },
    ]
    cache_dir = None
    target_os = ["android"]
    target_os_only = True
    target_cpu = "arm"
    is_component_build = True
    

根据需要自己定制编译目标,修改完成后,再执行

  • 执行命令

    gclient sync
  • 编译指定版本

    这之后gclient会自动下载v8源码,以及相关依赖项目。如果要指定某个v8版本编译,则需要先下载这个v8工程,再切换到对应版本,然后检出一个本地分支

    git clone https://github.com/v8/v8.git
    git checkout 6.0.328
    git checkout -b myv8
    gclient sync --with_branch_heads --jobs=1

    会遇到是否下载合并代码,选skip跳过,就可以在当前分支版本继续执行编译命令

  • 错误处理

    在编译过程中可能会遇到脚本报错,基本上是系统的某些库文件找不到,例如:

    ninja: Entering directory `out/foo/'
    [1252/1707] ACTION //:run_mksnapshot(//build/toolchain/android:android_arm)
    FAILED: gen/snapshot.cc snapshot_blob.bin 
    python ../../tools/run.py ./clang_x86_v8_arm/mksnapshot --startup_src gen/snapshot.cc --random-seed 314159265 --startup_blob snapshot_blob.bin
    ./clang_x86_v8_arm/mksnapshot: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
    [1253/1707] CXX obj/v8_base/code-stub-assembler.o
    ninja: build stopped: subcommand failed.

    找到出错脚本单独执行就可以看到报错

    python ../../tools/run.py ./clang_x86_v8_arm/mksnapshot --startup_src gen/snapshot.cc --random-seed 314159265 --startup_blob snapshot_blob.bin
    ./clang_x86_v8_arm/mksnapshot: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

    定位到问题,系统缺少libstdc++.so.6,使用yum命令安装对应库即可

  • 编译静态库
    由上述步骤,已经下载好整套编译环境,默认会下载到当前目录下的v8目录,切换只目录到v8文件夹,进入编译流程,先配置编译参数,使用gn命令生成编译参数

    gn args out/foo

    这时会打开一个名为args.gn的文本文件,根据需要填入以下参数

    
    # Build arguments go here.
    
    
    # See "gn args <out_dir> --list" for available build arguments.
    
    target_cpu = "arm"
    target_os = "android"
    v8_target_cpu = "arm"
    v8_static_library = true
    v8_enable_i18n_support = false
    v8_use_snapshot = true
    is_component_build = false

    敲入一下命令启动编译过程,执行完成就可以获得相应的静态库

    gn gen out/foo
    ninja -C out/foo

    最后遇到一个找不到libplatform.a的问题,看了网上的大多数解决方案,都不是很靠谱,自行研究发现其实挺简单,修复ninja编译命令参数文件,将libplatform.stamp文件编译为libplatform.a文件

    在执行完 gn gen out/foo 后先修改out/foo/build.ninja文件中v8_libplatform.stamp 改为 v8_libplatform.a,一共有三个地方

    build v8_libbase: phony obj/v8_libbase.stamp
    build v8_libplatform: phony obj/v8_libplatform.stamp ##  => v8_libplatform.a
    build v8_libsampler: phony obj/libv8_libsampler.a
    build v8_maybe_snapshot: phony obj/v8_maybe_snapshot.stamp
    build v8_nosnapshot: phony obj/libv8_nosnapshot.a

    再修改out/foo/obj/build.ninja,参照其他.a文件的生成规则,将最后一行改为生成.a文件

    build obj/v8_libplatform.stamp: stamp obj/v8_libplatform/default-platform.o obj/v8_libplatform/task-queue.o obj/v8_libplatform/trace-buffer.o obj/v8_libplatform/trace-config.o obj/v8_libplatform/trace-object.o obj/v8_libplatform/trace-writer.o obj/v8_libplatform/tracing-controller.o obj/v8_libplatform/worker-thread.o || obj/v8_libbase.stamp obj/build/config/exe_and_shlib_deps.stamp
    
    ##=>
    
    build obj/libv8_libplatform.a: alink obj/v8_libplatform/default-platform.o obj/v8_libplatform/task-queue.o obj/v8_libplatform/trace-buffer.o obj/v8_libplatform/trace-config.o obj/v8_libplatform/trace-object.o obj/v8_libplatform/trace-writer.o obj/v8_libplatform/tracing-controller.o obj/v8_libplatform/worker-thread.o || obj/v8_libbase.stamp obj/build/config/exe_and_shlib_deps.stamp
     arflags =
     output_extension = .a
     output_dir = obj

    最后执行 ninja -C out/foo编译项目,生成静态库

总结一下就是,项目中引入的依赖太多,才导致编译变得比较复杂,而且很多都是google的脚本,找不到命令文档,所以执行起来比较容易出问题。

参考文档:

CSDN Linux chromium 源码下载及编译

最后

以上就是鲜艳鸡翅为你收集整理的编译V8引擎的全部内容,希望文章能够帮你解决编译V8引擎所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部