Node.js C++ addon编写实战(一)之node-gyp

http://deadhorse.me/nodejs/2012/10/08/c_addon_in_nodejs_node_gyp.html

这是一个三篇的系列文章,记录Node.js C++扩展开发中的一些经验与坑。
Node.js
C++ addon编写实战(一)之node-gyp

Node.js
C++ addon编写实战(二)之对象转换

Node.js
C++ addon编写实战(三)之Buffer

补上第四篇:Node.js
C++ addon编写实战(四)之兼容v0.11+与nan模块

从node-waf到node-gyp

node进入0.8版本之后,开始替换之前编译C++模块的编译工具,从node-waf向node-gyp转换,暂时是两者都支持,之后会不在支持node-waf编译。因此要写node的C++扩展,首先需要了解如何编写node-gyp的配置文件。
node-gyp的配置文件名字为binding.gyp,它是一个纯JSON对象,相对于node-waf的配置文件来说,写惯了javascript的同学会更加熟悉。

Hello node-gyp

先来看一个最简单的使用示例。
C模块部分提供了一个hello方法,返回一个字符串world:

#include <node.h>
#include <v8.h>

using namespace v8;

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

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

NODE_MODULE(binding, init);

binding.gyp指定C部分源文件路径和最终生成模块的名称,此例中将会生成一个可以被node调用的binding.node文件。

{
‘targets‘: [
{
‘target_name‘: ‘binding‘,
‘sources‘: [ ‘binding.cc‘ ]
}
]
}

js调用代码:

var assert = require(‘assert‘);
var binding = require(‘./build/Release/binding‘);
assert.equal(‘world‘, binding.hello());
console.log(‘binding.hello() =‘, binding.hello());

一个复杂一点的例子

在编写node-hsf的时候,由于涉及到第三方库的引入,以及对mac和linux的兼容,因此编译脚本会相对更加复杂。

{
‘targets‘: [
{
‘target_name‘: ‘hsfProtocol‘,
‘sources‘: [‘hsf_protocol.cc‘],
‘cflags‘: [‘-fexceptions‘, ‘-Wall‘, ‘-D_FILE_OFFSET_BITS=64‘,‘-D_LARGEFILE_SOURCE‘, ‘-O2‘], //编译选项
‘cflags_cc‘: [‘-fexceptions‘, ‘-Wall‘, ‘-D_FILE_OFFSET_BITS=64‘,‘-D_LARGEFILE_SOURCE‘, ‘-O2‘],
‘cflags!‘: [‘-fno-exceptions‘], //关闭的编译选项
‘cflags!_cc‘: [‘-fno-exceptions‘],
‘conditions‘: [
[‘OS=="mac"‘, { //满足此条件后开启
‘xcode_settings‘: {
‘GCC_ENABLE_CPP_EXCEPTIONS‘: ‘YES‘
}
}]
],
‘include_dirs‘: [ //引用第三方库的头文件路径
‘../hsf_protocol/utils‘,
‘../hsf_protocol/objects‘,
‘../hsf_protocol/hessian‘,
‘../hsf_protocol/hsf‘]
}
]
}

注意事项:
1. 如果遇到了exception handling disabled, use -fexceptions to
enable
错误,需要添加编译选项-fexceptions。如果还是不行,则可能是因为该版本的node-gyp默认启用了-fno-exceptions选项,因此通过cflags!cflags!_cc中指定关闭掉这个默认开启的选项。
2. conditions内可以根据一些条件来添加选项,例如根据操作系统来添加一些编译条件。
3.
依赖的第三方动态链接库可能无法引入,出现这种情况可以把静态库和node-gyp生成的中间文件一起编译成最终的模块。

#!/bin/bash
HSFPROTOCOL_HOME="`pwd`/hsf_protocol"
SYSTEM=`uname -s`
EXTRA_FLAG="";

if [ $SYSTEM = "Darwin" ] ; then #判断是否是mac操作系统
# for mac
EXTRA_FLAG="-flat_namespace -undefined suppress"
echo ‘building for mac‘
fi
node-gyp configure build
gcc -fcc1-exceptions -fexceptions -O2 -o hsfProtocol.node ./build/Release/obj.target/hsfProtocol/hsf_protocol.o \
$HSFPROTOCOL_HOME/libhsf.a -shared -fPic $EXTRA_FLAG

可以看到在上面脚本中,把node-gyp生成的中间文件hsf_protocol.o与静态库libhsf.a编译成最终的hsfProtocol.node。为了进行跨平台的编译,如果是mac操作系统,则需要多添加-flat_namespace
-undefined suppress
这几个编译选项。

关于node-gyp的一些其他参考资料和范例和更复杂的用法,请查阅node-gyp
in github

Node.js C++ addon编写实战(一)之node-gyp,布布扣,bubuko.com

时间: 2024-07-28 18:52:01

Node.js C++ addon编写实战(一)之node-gyp的相关文章

Node.js Express+Mongodb 项目实战

Node.js Express+Mongodb 项目实战 这是一个简单的商品管理系统的小项目,包含的功能还算挺全的,项目涵盖了登录.注册,图片上传以及对商品进行增.删.查.改等操作,对于新手来说是个很不错的练手项目,分享给大家. GitHub源码:https://github.com/oceanMin/cms 项目前准备 安装node.js 安装express 安装mongoDB 章节目录 快速开始 快速开始 模块 express商品管理系统介绍 框架搭建.ejs .express.static

深入浅出Node.js(一):什么是Node.js

Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟Joyent获得企业资助,再到今年发布Windows移植版本,Node.js的前景获得了技术社区的肯定.InfoQ一直在关注Node.js的发展,在今年的两次Qcon大会(北京站和杭州站)都有专门的讲座.为了更好地促进Node.js在国内的技术推广,我们决定开设“深入浅出Node.js”专栏,邀请来自Node.js领域的布道师.

Node.js源码解析----自己实现一个Node.js的难点与思路

前言: 最近在看Node.js,看了一段时间后便想着自己实现一个Node.js现在已经实现了个大概(绝大部分是模仿人家,不过自己实现一遍基本上就理解Node.js的原理了)下面便说说这个过程中的坑,以及一些需要注意的地方: Node.js需要一定C++基础,建议看完C++Primer再看,否则V8的好多表达方式,指针,引用,模板之类的会看不懂: 代码已上传GitHub地址:   https://github.com/sven36/cNode 编译:我用的win10的环境,具体编译请参考Node.

用node.js 搭建的博客程序心得(node.js实战读书笔记1)

学习node已经有一段时间了,之前把了不起的node.js看完了,基本算了解了一些node的基本的用法还有一些概念了,然后就开始看第二本node.js实战,第一章就是搭建一个博客程序.但是不得不吐槽一下node,发展得太块了,很多库已经和之前的用法不一样了,就要一直去百度google来查询最新的用法,其实我觉得这样并不见得是一件好事,因为不稳定,所以就不好学习,就要一直保持对于node的关注.不废话了,这篇文章就大概说一些在这章里面所学习到的一些东西,经验总结吧 1.express - 基于 N

用vs2013开发node.js的addon.

? ? 下载node.js的源代码. https://github.com/joyent/node 如果用svn下载,后面加上/trunk,以免把用不着的branches也下载下来,浪费时间. 安装VS, express版本也可以.我安装的是vs2013 ultimate. 安装python 2.x http://www.python.org/download/ 注意不能是3.x, 因为node-gyp目前需要2.x. 我安装的是2.7. 用命令行工具,Cd到node源代码目录,运行vcbuil

Node.js继承中的静态类对象(《node.js开发实战详解》书中一些错误的改正)

今天气真好,最近挂掉一些面试之后心情略失落. 神马都是浮云,要永远做好世界第二. 不多提了,你问我心态为啥变好了.-------都是情怀,,. 嗯啊,最近在研究node. 别人问?你这水平还node... 哈哈哈,好伤心.... 不多提了,言归正传. 神马模块化神马的先就不多讲了,就一个module.export和export区别,后者对象的属性属于前者,逆命题不成立. 还有util.inherits(A,B)这个API注意一下A只会继承B的原型方法,原型以外的不会继承.不是说原型中数据是共享的

node.js零基础详细教程(7):node.js操作mongodb,及操作方法的封装

第七章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. node.js操作mangodb 创建一个用于放置今天文件的文件夹,npm init初始化一下,并创建demo1.js用于写node代码 使用 npm install mongodb,将mongodb控制模块安装到本地 在demo1.js中写

node.js零基础详细教程(4):node.js事件机制、node异步IO操作

第四章 建议学习时间3小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. node.js事件机制 node.js是单线程,但是通过事件和回调支持并发,可以实现非常高的性能. node.js所有的API都是通过异步调用.第一堂课的时候,我们写过一个同步和异步的示例(如下),当初说到:同步代码先执行完成,然后才执行异步

方便大家学习的Node.js教程(一):理解Node.js

理解Node.js 为了理解Node.js是如何工作的,首先你需要理解一些使得Javascript适用于服务器端开发的关键特性.Javascript是一门简单而又灵活的语言,这种灵活性让它能够经受住时间的考验.函数.闭包等特性使Javascript成为一门适合Web开发的理想语言. 有一种偏见认为Javascript是不可靠的,然而事实并非如此.人们对Javascript的偏见来源于DOM,DOM是浏览器厂商提供的用于Javascript与浏览器交互的API,不同浏览器厂商实现的DOM存在差异.