本文介绍在一个较老的环境下编译 V8 引擎,并全静态地链接到既有的游戏服务上。原因是我们需要一个很新的能支持 WebAssembly 的 JS 引擎。经过调研,我们认为使用 V8 是最好的。
游戏服务使用 GCC4.4.6,这是一个非常老的版本,甚至不能完整支持 C++11 标准。而即使是很老版本的 V8 都需要完整的 C++11 支持(GCC 4.8+)。进一步地,最新版本的 V8 需要 C++14 标准的支持:
- v8.h 中出现了诸如
std::remove_cv_t的 C++14 的标准库函数 - C++14标准编译出来的库也没办法直接和原游戏的目标文件进行链接
因此我们的方案是将游戏中对 V8 强依赖的模块升级成 C++14 标准,主要步骤如下:
- 从源码构建 GCC 和 GLIBC
- 从源码构建 V8 静态库 v8_monolith.a
- 将 V8 静态库、libc++、GLIBC 和游戏模块全静态链接