使用C++为node.js写扩展模块


Posted in Javascript onApril 22, 2015

前提: 安装好node.js、Python2.7与visual studio 2013。

过程:
首先安装GYP项目生成工具,npm install -g node-gyp 。
建立test目录,这是我们的工作目录,在此目录下再建一个src目录,用来存放C++源代码,另新建一个名为binding.gyp的文本文件,这是gyp的项目文件,内容如下:

{

    'targets':[{

        'target_name':'hello',

        'sources':['src/hello.cc']

    }]

}

再写一个简单的hello.cc,内容如下:

#include <node.h>
using namespace v8;

Handle<Value> Hello(const Arguments& args) {
 HandleScope scope;
 return scope.Close(String::New("Hello world!"));
}

void init(Handle<Object> target) {
 NODE_SET_METHOD(target, "hello", Hello);
}

NODE_MODULE(hello, init)

然后运行命令: node-gyp configure
如果正确运行的话,会出现一个目录----build,其下为你生成了vs2013的项目文件,这样就可以在vs2013中进行编辑与编译了。
当然也可以直接用命令 node-gyp build进行编译。

测试js程序如下:

var hello = require('./hello');

console.log(hello.hello());

其中遇到了一些问题,记录如下:

1、C:\Users\Administrator.node-gyp\0.10.33这个目录下,没有默认Debug目录,在vs2013中编译成debug文件时会提示 error LNK1104: cannot open file 'C:\Users\Administrator.node-gyp\0.10.33\Debug\node.lib' ,建立一个Debug目录,把与你操作系统环境相同的目录下的node.lib拷贝到其中就好了。

2、NODE_MODULE(hello, init)中的hello是模块名,需要与文件名保持一致,不然编译没问题,运行时会出错。因为在require('./hello.node')时,既去找相应的文件,也匹配对应的MODULE。

3、我是对应着朴灵的《深入浅出node.js》这本书,并参考一些网页进行学习的,书给出的gyp项目文件中有一个conditions项,'libraries' : ['-lnode.lib'] ,因为这一句,编译时一直报错:can't open node.lib,明明文件是存在的,但就是报错,找了很多资料,也没解决,后来我把node.lib直接拷贝到工作目录下,用命令行编译成功了!但在vs2013中,错误还是依旧,我怎么想都不对,最后上官网,发现人家的例子都没有给出这种参数,我就试着把这个东东删除了,结果一切OK!大神们,谁能给出一个正确的解释?!

以上所述上就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
彻底搞懂JS无缝滚动代码
Jan 03 Javascript
javascript比较文档位置
Apr 08 Javascript
javascript 二维数组的实现与应用
Mar 16 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
Nov 09 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
Vue filter介绍及其使用详解
Oct 21 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 Javascript
vuex 的简单使用
Mar 22 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
Dec 20 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
Jul 20 Javascript
微信小程序实现简单的select下拉框
Nov 23 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 #Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 #Javascript
jscript读写二进制文件的方法
Apr 22 #Javascript
javascript格式化json显示实例分析
Apr 21 #Javascript
JavaScript汉诺塔问题解决方法
Apr 21 #Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
Apr 21 #Javascript
JavaScript实现动画打开半透明提示层的方法
Apr 21 #Javascript
You might like
解析ajax事件的调用顺序
2013/06/17 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
js location.replace与location.reload的区别
2010/09/08 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
详解JavaScript的变量
2019/04/04 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
python使用插值法画出平滑曲线
2018/12/15 Python
Python模块的加载讲解
2019/01/15 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
电气技术员岗位职责
2013/11/19 职场文书
电焊工工作岗位职责
2014/02/06 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
专业见习报告范文
2014/11/03 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis