概述
由于项目项目中最近用到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引擎所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复