写在前面的话
项目需要,研究一下v8引擎,简介就不说了,官网是:
https://v8.dev
你在官网doc目录下,你能找到全部的教程,包括本文的一部分内容也是搬运过来:
https://v8.dev/docs
但是,搭建环境的过程总是那么不尽人意,我花了一天多才搞定环境。网上的文档有很多,大部分的都太老了,不具备参考意义。我中间遇到了3个问题,差点被劝退,可能下次你遇到的又不一样了。
如果你碰到了问题,可直接跳转到 “遇到的问题” 看看
踩坑后原创,你就不要转载了。
文档的时间是:2022年4月
我的环境
-
macOS Monterey 12.1
-
Xcode 13.2 Build version 13C5066c xcode-beta
-
python3.10(mac默认安装python2.7,这里有个坑,后面会说)
-
全程梯子
开始搭建环境
1.拉代码
推荐直接拉depot_tools仓库,它相当于是一个工具,管理着v8的代码,官方更推荐用它,我也用的是它。
注:这是在google git上,并非github上,需要自行翻墙注册goolgle git账号,还需要visa卡认证,反正挺搞人的
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
或不推荐但能用:
官方github上有v8的镜像,地址如下,但是github上没有官方的depot_tools镜像,有条件的建议还是老老实实走上面方式:
https://github.com/v8/v8
2.加载依赖
等代码都拉完了,切到depot_tools目录下
mkdir ~/v8
cd ~/v8
拉v8代码,总共1.1G,时间有点长。
可以试试在github官方镜像下拉下来,拷贝到depot_tools目录下
fetch v8
更新依赖库,如果你没有depot_tools工具的话,我也不知道该咋办。
gclient sync
3.一键编译
gm脚本是一键编译脚本,刚开始弄建议用它编译就好
~/workspace/depot_tools/v8/tools/dev/gm.py
添加到环境变量下,看自己喜好
alias gm=/User/xxxx/workspace/depot_tools/v8/tools/dev/gm.py
开始构建,要花很长的时间,这里编译遇到了几个问题。请移步 “遇到的问题”
gm x64.release
//或者,要在构建后立即运行测试:
gm x64.release.check
最后,在out目录下找到d8文件
~/workspace/depot_tools/v8/out/x64.release/d8
官方提供手动编译都流程,我暂时用不到,请移步官网:
https://v8.dev/docs/build-gn
4.运行测试
d8命令行运行:
创建一个helloworld.js
'use strict';
async function hello() {
console.log("hellow");
}
hello();
./d8 hello-world.js
5. Xcode上调试
搭好断点调试环境后学习可以事半功倍。
//在v8目录下执行
gn gen out/gn --ide="xcode"
随后,你在这个目录下就能找到工程文件,用xcode打开它:
~/workspace/depot_tools/v8/out/gn/all.xcodeproj
在Xcode工具栏 product -> scheme 选择d8,等待Xcode遍历文件后,build工程,相当于执行了下面指令,需要花比较长的时间。
build后,点击run,在右下角应该会出现shell交互界面,与你执行 . /d8 一样。
gm x64.release.check
sample/hello-world.cc 示例也一样build就行,我是通过这个示例慢慢断点学习的。
以上你就完成了基础的内容了。
6.在 C++ 应用程序中嵌入 V8 JavaScript 引擎
你可直接看官网文档,我搬运过来的:https://v8.dev/docs/embed
//以官方hello-wold为例
~/workspace/depot_tools/v8/samples/hello-world.cc
//找到它
~/workspace/depot_tools/v8/tools/dev/v8gen.py
//官方也建议你也加到~/.bash_profile里去
alias v8gen=/User/xxx/workspace/depot_tools/v8/tools/dev/v8gen.py
//在v8根目录下
//开始构建,花很长时间
tools/dev/v8gen.py x64.release.sample
//在 Linux 64 系统上构建静态库:
ninja -C out.gn/x64.release.sample v8_monolith
//编译hello-world.cc,链接到构建过程中创建的静态库。例如,在 64 位 Linux 上使用 GNU 编译器:
g++ -I. -Iinclude samples/hello-world.cc -o hello_world -lv8_monolith -Lout.gn/x64.release.sample/obj/ -pthread -std=c++14 -DV8_COMPRESS_POINTERS
//最后你在v8根目录下就能找到hello-world
./hello-world
Hello, World!
3 + 4 = 7
//你成功了。
上面基本上是全部的内容了,下面是我编译时碰到的几个问题。
遇到的问题
问题一
编译的时候我有以下的报错:
ImportError: cannot import name zip_longest
这个问题是耽误我最久的了。
开始挠头+1
原因就是python版本不对,py3是zip_longest库,py2下是izip_longest。
mac自带2.7版本的python,我尝试用修改~/.bash_profile,使用alias,不尽人意,即便bin修改成了python3,但是用到的库还是mac下2.7版本的库
你在/usr/bin下可以看到,编译的时候用到了这里头的库:
lrwxr-xr-x 1 root wheel 75 Dec 8 07:39 python -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
开始挠头+2
这个python软链,还是只读的,网上说出厂就给你定死了,在磁盘的只读区域里。网上有办法修改它,但是我没成功,也就没这么干。
你非要改,参考链接如下:
https://www.csdn.net/tags/Ntjakg3sMTU0NjgtYmxvZwO0O0OO0O0O.html
曲线救国
仅针对这个报错,stack overflow上有其它办法,就是修改你的代码,把import的库修改一下。
我没这么干:
https://stackoverflow.com/questions/38634810/failing-to-import-itertools-in-python-3-5-2
我的解决办法
经过反复抓狂后,在stack overflow下了解到了conda包管理器。
安装你的conda
https://docs.conda.io/en/latest/miniconda.html
教程你可以看这里:
https://www.cnblogs.com/chantmee/p/15359704.html
测试一下
conda -V
conda装完后,你会发现你的bash变成了这样:
(base) xxxdeMacBook-Pro:x64.release xxx$
你现在正处于base默认的环境下。
创建python3.10的环境,会给你拉好多库:
//3.10是版本号,看你心情就好。py310是自定义环境名,也看你心情
conda create -n py310 python=3.10
环境弄好后,使用以下切换到这个环境
conda activate py310
随后,你的bash变成了这样
(py310) xxxdeMacBook-Pro:x64.release xxx$
再次尝试编译:
gm x64.release.check
终于大功告成。
问题二
忘了在哪一步出的错,应该也是编译的时候。
xcode-select: error: tool ‘xcodebuild’ requires Xcode, but active developer directory ‘/Library/Developer/CommandLineTools’ is a command line tools instance
这个在stack over flow上有解答了:
https://stackoverflow.com/questions/17980759/xcode-select-active-developer-directory-error
或者看图片:
问题三
我在拉取依赖的时候,碰到了证书验证不通过
gclient sync
报错内容大致如下,证书验证不通过:
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)
后来想想,可能是我梯子的问题,也抓狂了好久,执行一下脚本就好了:
踩坑后原创,你就不要转载了。
最后写完blog想到的,你如果拉不到depot_tools,我可以发你。