vc2010使用google V8 引擎编译开发若干问题解决办法

时间:2022-04-06 06:20:33

项目需求:

        开发一款能够支持脚本语言的工业设备测试软件

        开发环境: VS2010

        开发系统: WINDOWS XP S3


Google V8 引擎的编译过程

         由于需要从Google官网Git出V8引擎的源代码,所有需要一款VPN软件来进行Google的访问。

         1.从https://chromium.googlesource.com/v8/v8.git/ 中下载引擎源码,由于本人使用的XP系统,VS2010不需要下载最新版本,本人下载的为3.27.0版本,对于MFC中使用足够了。

         2.解压缩第1步下载完成的3.27.0版本,里面没有third_party文件夹,自己建立一个名称一定要是“third_party”

         3.从https://chromium.googlesource.com/?format=HTML 找到 gpy,icu,克隆到本地计算机中刚刚第2不建立的third_party文件夹中

         4.下载python2.7版本,并安装好。

         5.设置环境变量到计算机中,就是右击“我的电脑”->"属性"->"高级"->"环境变量"把gyp,icu,python的路径加入即可。

         6.打开cmd,进入3.27.0文件夹目录下的build文件夹,开始生成VS的工程

         6.1 V8静态库生成 只需要输入 python gyp_v8 回车即可

         6.2 V8动态库生成 需要输入4条指令:

          set DEPOT_TOOLS_WIN_TOOLCHAIN=0

          set GYP_MSVS_VERSION=2010

          set GYP_DEFINES=component=shared_library

          python gyp_v8

          7.打开build文件夹,点击all.sln,编译即可生成库文件。


Google V8 在VC线程中使用问题

            1.刚开始由于使用的是3.6.0版本,属于网上教程比较多比较老的版本,还没有使用 ‘Isolate‘。导致在线程中使用报错,使用3.27.0版本就可以解决问题,示例代码如下:

//-------------------------------------------------------------
// 创建一个句柄作用域(在栈上)
//-------------------------------------------------------------
Isolate* pIsolate = Isolate::New();

if(NULL == pIsolate)
return;

//-------------------------------------------------------------
// 住入栈空间
//-------------------------------------------------------------
Isolate::Scope Isolate_scope(pIsolate);

//-------------------------------------------------------------
// 创建栈空间句柄
//-------------------------------------------------------------
HandleScope handle_Scope(pIsolate);

//-------------------------------------------------------------
// 创建上下文空间
//-------------------------------------------------------------
Handle<Context> hContext = CreateContext(pIsolate);

//-------------------------------------------------------------
// 输入编译和运行脚本的上下文空间
//-------------------------------------------------------------
Context::Scope context_scope(hContext);

//-------------------------------------------------------------
// 加载JS文件返回句柄
//-------------------------------------------------------------
Handle<String> hSource;

//-------------------------------------------------------------
// 编译JS文件返回句柄
//-------------------------------------------------------------
Handle<Script> hScript;

Google V8 在 MFC工程关闭后内存泄露问题

             1.由于V8静态库太大不想使用静态库就使用了V8动态库,VC工程也是链接的MFC 动态库,所以当关闭软件时,输出窗口会提示一堆的内存泄露,这个内存泄露非常有意思只要是用到V8中的变量类型,就算函数或者变量不调用都会有内存泄露,对于内存泄漏和程序警告本人是绝对不能容忍的所以想尽办法也要解决掉。

              2.原来这个问题是MFC的BUG,原因是因为,软件在关闭时,MFC先将自身加载的依赖DLL先释放,再释放用户的DLL,由于我建立的MFC工程时动态链接MFC库,所以内存空间与V8 DLL的内存空间是共用的,知道了这一点做了如下尝试

              2.1 将MFC工程修改为静态链接MFC库,在这个过程中由于本人使用了'BCGControlBar Pro Evaluation'第三方界面库,又要重新去编辑这个家伙的静态库,完成后又遇到一对链接错误原来使用这个静态库还需要在stdafx.cpp中加入以下两句话:

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>

             2.2 编译成功后,启动软件再关闭,果然问题解决,再也没有内存泄露了,可是对于本人这么有洁癖的人怎么甘心使用静态库,一个exe文件编译出来30M,于是又做了如下尝试

            2.3 MFC工程动态链接MFC库,新建一个DLL工程动态链接MFC库,然后链接动态V8引擎DLL,在DLL工程中封装好调用V8引擎,再在VC程序中动态加载LoadLibrary DLL,关闭软件时再FreeLibrary,结果失败。。还是内存泄露.

            2.4 MFC工程动态链接MFC库,将DLL工程改变成静态链接MFC库,然后链接静态V8引擎Lib再在VC程序中动态加载LoadLibrary DLL,关闭软件时再FreeLibrary,哈哈成功,只是这个DLL文件有10M大小。