title: google v8 实战 -- 构建v8

首先用废话热热身,再来马上很快就讲怎么样构建v8。

事情源起于不久前用Gmail(http://mail.google.com)读《ACM Queue》,里面有
篇文章说google又抛出个叫
o3d(http://code.google.com/intl/zh-CN/apis/o3d/)的东东,支持在浏览器内
实现3D硬件加速,而且还可以用Javascript开发,o3d将引领Web 3D的新风潮。

作为3D兼js爱好者,区区当然要一探究竟啦。花半天把o3d源代码拉下来后,发现
google对o3d的野心不小。刚发布就有了3个主流浏览器的插件、而且配备丰富的
实例和工具库。

但是为什么又是v8呢?仅仅因为o3d也使用了v8,nonono,google的关联推荐从来
都是强大的(这不正是http的本质么?)。哪怕你只看看o3d,你已经同时访问了
code.google.com的服务,同时知道google有简单易用的Sketcup 3D建模软件,并
且o3d中还使用到了和google chrome一样的v8引擎。

Oh God! google已经把技术堡垒都建好了,作为开发人员,我们还是别偷懒,
先……

构建v8

v8的项目主页是http://code.google.com/p/v8/。在其Sources页面下有下载源代
码的方法,本文讲述用源代码构建,如果读者只对binary release感兴趣,请略
过。

如果大家和区区一样,已经安装了svn(http://subversion.tigris.org/),那么
只要在命令行输入:
svn checkout http://v8.googlecode.com/svn/trunk/ v8
即可将v8代码树下载。

或者用TortoiseSVN(http://tortoisesvn.tigris.org/)下载也可以。

打开v8

双击下载的e:/work/v8/tools/visual_studio/v8.sln文件(e:/work是区区的工作
目录,下同),vs2008会提示转换,狂点'finish'/'next'/'ok'就好了。
提下来按F7键,就可以完成构建了。简单吧。

难在前提:
1.最好是安装vs2008,加sp1。(怎么装?这问题,在国内,不好回答,要不你就装express版吧)
2.区区用的是Vista 64位版本,xp应该也没问题
3.要安装有python(http://python.org/)2.5以上版本,或者是ActivePython(http://www.activestate.com/activepython/)

实战一个hello程序

总不能构建完就睡觉了对吧?就直接在v8.sln解决方案中,添加一个
WTL(http://wtl.sourceforge.net/)工程,起名叫v8_hello。(这个随便都行)
在向导后面的部分选择创建模式对话框应用程序即可

WTL的主要代码在MainDlg.h中,直接贴上:

// MainDlg.h : interface of the CMainDlg class // / #pragma once #include <v8.h> #include <comutil.h> #include "jrutils.h" class CMainDlg : public CDialogImpl<CMainDlg> { public: enum { IDD = IDD_MAINDLG }; BEGIN_MSG_MAP(CMainDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout) COMMAND_ID_HANDLER(IDOK, OnOK) COMMAND_ID_HANDLER(IDCANCEL, OnCancel) END_MSG_MAP() // Handler prototypes (uncomment arguments if needed): // LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) // LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { // center the dialog on the screen CenterWindow(); // set icons HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR); SetIcon(hIcon, TRUE); HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); SetIcon(hIconSmall, FALSE); Try_V8(); return TRUE; } LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { CSimpleDialog<IDD_ABOUTBOX, FALSE> dlg; dlg.DoModal(); return 0; } LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { // TODO: Add validation code EndDialog(wID); return 0; } LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { EndDialog(wID); return 0; } void Try_V8() { using namespace v8; // Create a stack-allocated handle scope. HandleScope handle_scope; // Create a new context. Persistent<Context> context = Context::New(); // Enter the created context for compiling and // running the hello world script. Context::Scope context_scope(context); // Create a string containing the JavaScript source code. Handle<String> source = String::New("'Hello' + ', World!'"); // Compile the source code. Handle<Script> script = Script::Compile(source); // Run the script to get the result. Handle<Value> result = script->Run(); // Dispose the persistent context. context.Dispose(); // Convert the result to an ASCII string and print it. String::AsciiValue ascii(result); mslog(_bstr_t(*ascii)); } };

注意这三句包含
#include <v8.h>
#include <comutil.h>
#include "jrutils.h"
其中的conutil.h和jrutils.h完全是为了执行
mslog(_bstr_t(*ascii));而加入,不是必要的。

v8_hello的主要功能在void Try_V8()函数中,这些代码来自v8的Getting
Started文档
(http://code.google.com/intl/zh-CN/apis/v8/get_started.html)中的第二个
例子,注意由于我们拿的是最新代码,第一个例是是编译不过的(没有context和
scope)。

要编译过这个工程,v8_hello必须加入include和lib目录和.lib链接库,对于区
区的机器环境,来说,要在v8_hello的工程属性中设置下面几项:
Configuration Properties_C/C++_General_Additional Include Directories: e:/work/v8/include/
Configuration Properties_Linker_General_Additional Library Directories: e:/work/v8/tools/visual_studio/Debug/lib/
Configuration Properties_Linker_Input_Additional Dependencies:v8.lib Ws2_32.lib Winmm.lib comsuppwd.lib

一切正常的话,按F5运行吧~

至此,我们就v8 say hi了。。

google v8 实战 -- 构建v8相关推荐

  1. 图解 Google V8 # 01:V8 是如何执行一段 JavaScript 代码的?

    说明 图解 Google V8 学习笔记 JavaScript 的设计思想 JavaScript 借鉴了很多语言的特性: C 语言的基本语法 Java 的类型系统和内存管理 Scheme 的函数作为一 ...

  2. 金仓数据库 KingbaseES V8.3 至 V8.6 迁移最佳实践(4. V8.3 到 V8.6 数据库移植实战)

    4. V8.3 到 V8.6 数据库移植实战 由于 KingbaseES 内部兼容特性,在实际应用中,一般只需很少甚至不做任何修改,用户便可把 V8.3 数据库移植到 V8.6 环境中运行.不仅如此, ...

  3. Google Guava 实战之List篇

    文章目录 Google Guava 实战之List篇 一.导入依赖 二.List Lists.cartesianProduct:返回俩个集合的n元笛卡尔积 Lists.reverse:返回指定列表的反 ...

  4. Web 函数自定义镜像实战:构建图象处理函数

    Web 函数自定义镜像实战:构建图象处理函数 本篇文章写作于 2021.07.23 前言 作为一名前端工程师,我们经常会在 H5, 或者小程序中,使用 Canvas 来处理或生成图片. 不过在有些禁用 ...

  5. 金仓数据库 KingbaseES V8.3至V8.6迁移最佳实践(3. KingbaseES移植能力支撑体系)

    3. KingbaseES移植能力支撑体系 本章节包含以下内容: 迁移工具 KingbaseES应用能力概述 KingbaseES支撑系统割接能力 3.1. 迁移工具 KingbaseES 支持应用系 ...

  6. 【微信小程序入门到精通】—小程序实战构建售货平台首页

    目录 前言 一.步骤阐述 二.新建项目并梳理结构 三.配置导航栏 四.tabBar 实现 五.轮播图实现 总结 前言 对于目前形式,微信小程序是一个热门,那么我们该如何去学习并且掌握之后去做实际项目呢 ...

  7. 【阅读笔记】联邦学习实战——构建公平的大数据交易市场

    联邦学习实战--构建公平的大数据交易市场 前言 1. 大数据交易 1.1 数据交易定义 1.2 数据确权 1.3 数据定价 2. 基于联邦学习构建新一代大数据交易市场 3. 联邦学习激励机制助力数据交 ...

  8. google的gn构建系统

    什么是GN? GN是一个生成Ninja构建文件的元构建系统,以便你可以用Ninja构建Chromium. 你为什么从GYP切换? 我们相信GN文件比GYP文件更具可读性和可维护性. GN很快: GN比 ...

  9. [Google API](8)构建使用Google API的Java应用程序

    Google 搜索引擎建立起了通过 Web 服务接口可用的索引.拼写建议和缓存页面,从而允许所有语言的程序员都能就个人使用存取信息.Google 搜索引擎还提供了 Java API,从而存取数据更为便 ...

最新文章

  1. PPO-强化学习算法
  2. ibatis spring框架升级到5.x_Java SSM框架常见面试题,良心整理,
  3. SQL Server2008附加数据库失败
  4. php curl array,PHP curl_setopt_array函数有什么用
  5. [源码和报告分享]基于Android-JavaEE-DB2实现的旧物交易平台
  6. 从Soul APP 看社交升级新玩法
  7. HTML 显示梯形图片
  8. 用Python解决女朋友看电影没字幕的需求
  9. 京东商品长图功能来啦 不用改图一键生成长图
  10. ratel平头哥电脑感染app
  11. 吸烟行为检测系统(Python+YOLOv5深度学习模型+清新界面)
  12. SOLIDWORKS中钣金展开标注是英文怎么办?
  13. js写小游戏(打字母)
  14. 解决pycharm Python helpers are not copied yet to the remote host. Please wait until remote interpreter
  15. sap 消耗策略999_SAP 计划策略
  16. Python和C语言哪个更容易学,感觉学了C语言有点难,只学过C语言的大学生很迷茫?
  17. (四)Spring核心思想 - IOC与DI
  18. word无法验证服务器,Win8系统打开office文件提示“无法验证此产品的许可证”如何解决...
  19. JAVA将文字转语音文件
  20. Unity 网络摄像设备 - WebCamDevice

热门文章

  1. 排列显示阿拉伯语、数字及英文时的处理方法
  2. Android安卓——入门学习
  3. Android版疯狂填字第三关,iOS/安卓版《疯狂填字》答案攻略第三十八关
  4. EMAC和GMAC区别
  5. 计算机ppt制作培训心得体会,制作ppt学习心得体会.doc
  6. 基于Java毕业设计在线直播平台源码+系统+mysql+lw文档+部署软件
  7. 网络工程师成长日记384-商南PIX防火墙网络项目回忆录
  8. 用Python可以解决的数学问题,探究代数、统计、几何、概率等
  9. 计算机网络 DNS服务介绍
  10. 构筑企业供应链高效协同优势,智能供应链系统助推汽车服务行业数字化订单管理