mac下搭建v8环境

写在前面的话

项目需要,研究一下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,我可以发你。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值