准备工作

node使用c++插件时需要使用node-gyp包,node-gyp把c++源码编译为二进制文件,js在调用二进制文件,编译后的二进制文件模块调用就和js的模块调用一样。

npm install -g node-gyp

除了node-gyp还需要安装其他准备工具。

类Unix下的准备工具

在类Unix下只需在安装 g++工具

sudo apt-get install g++ ;
// or
sudo yum install g++

因为在学校里我把apt-get 配置为学校的源,回来后用不了学校的源(貌似只能在校园网的环境下使用),然后我再修改为其他源时只更改了地址,结果一直安装不上,,,最后的最后才发现我修改的apt源有问题,不仅需要修改地址,还要看下后面 trusty,precise还是其它的

// 之前的是:
deb http://**.xidian.edu.cn/ubuntu/ precise main xxxxxxxxxxxxxx // 修改时只改了地址,安装时就只会出错
deb http://mirrors.163.com/ubuntu/ precise main xxxxxxxxxxxxxxxx // 正确的是
deb http://mirrors.163.com/ubuntu/ trusty main xxxxxxxxxxxxxxxxx

Windows下准备工具

在Windows下需要安装python和visualC++ ,python在执行configure命令时调用,vcbuild在编译时使用

python安装2.7版本的

visual C++实在是太大了,所以网上有另外一种解决方式:

// 以管理员的身份运行   找到cmd,右键,以管理员身份运行;运行此命令后会安装python2.7 和编译工具
npm install --global --production windows-build-tools
npm update

编写C++模块

因为我对C++也不熟悉,所以从官网上拿个例子下来。存为 addon.cpp文件

#include <node.h>
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void Method(const FunctionCallbackInfo<Value>& args) { // Method方法,使用const FunctionCallbackInfo<Value>& args接受函数参数
Isolate* isolate = args.GetIsolate();
args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));
}
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method); // 导出模块的hello属性,hello属性指向 Method方法 类似js里的 {hello: function Method(){}}
}
NODE_MODULE(addon, init) // 注意这里没有分号结尾 导出模块
}

配置与编译

node-gyp 配置文件

{
'targets': [
{
'target_name': 'addon', // 编译后为addon.node文件
'sources': ['./addon.cc'] // 需要编译的源码
}
]
}

node-gyp configure命令会在当前项目下生成项目文件(供编译时使用),node-gyp build 命令调用编译工具进行编译,最终得到一个node类型文件,该文件在 build/Release下,在这里生成的是addon.node文件

引用模块

新建test.js文件

let addon = require('./build/Release/addon.node');
console.log(addon.hello()); // 'world'

node-gyp 命令

命令 功能
install 安装开发文件,针对特定版本的node
list 当前安装的工具列表
remove 移除node特定版本的开发者文件
clean 移除所有用configure和build命令生成的文件
configure 为当前模块生成编译配置信息等
build 编译当前模块
rebuild 重新配置编译当前模块 相当于 clean ,configure, build的组合

c++更多示例请看官网 c/c++插件 或者百度网盘pdf版本

文档里提供了函数的参数、回调、对象工厂、函数工厂、包装c++对象、包装对象的工厂、传递包装的对象等列子。

node里面的c/c++模块的更多相关文章

  1. node里面的buffer理解

    node提供了专门读写文件的模块,文件内容都是2进制存放在内存中的 node读取文件的结果都是16进制,那么你要学会进制转换,二进制0b开头 ,八进制0开头,十六进制0x 基础知识: 1字节=8bit ...

  2. 关于ES7里面的async和await

    async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度,本篇文章将分享asy ...

  3. procps包里面的sysctl命令

    procps包里面的sysctl命令 --http://www.cnblogs.com/createyuan/p/3740917.html?utm_source=tuicool&utm_med ...

  4. QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)

    =QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是 ...

  5. node.js中使用http模块创建服务器和客户端

    node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...

  6. spring里面的ioc的理解?

    spring里面的ioc就是控制反转,其实现核心是DI(依赖注入),控制反转不向以前java代码里面,通过new关键字来实现创建对象,这样每段代码之间的耦合度就比较高,为了降低每个小模块之间的耦合度, ...

  7. 深入理解js里面的this

    闲聊两句(可以忽略): 毕业有半年了,时间还过得真快,不过还好,感觉自己相对于刚毕业那会确实成长了很多:好久没有打游戏了(自己决心要戒掉的),消磨时光的时候就看看电影或者追追电视剧,再无聊就洗洗衣服. ...

  8. QVariant(相当于是Java里面的Object,是万能的容器,但要注册)

    这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是int,也可以是一个颜色值 ...

  9. 方阵里面的dp

    打了一场luogu的信心赛,惊讶地发现我不会T2,感觉像这样在矩阵里面的dp看起来很套路的样子,但是仔细想想还是有很多需要注意的细节. 又想到之前貌似也考过一些类似的题目 然而我并没有改 ,于是打算补 ...

随机推荐

  1. Oracle索引批量重置笔记

    ---单个索引重置语句 alter index indexname  rebuild; ---查询数据索引对象语句 select *  from user_indexes; ------将数据库的索引 ...

  2. VBA编程的工程性规划

    看过很多人写的VBA代码,一团一团的,一点规划都没有,为了VBA编程更具工程性,这里讨论一下,并列出自己的一些建议:0.给VBA工程定义一个名字,而非直接使用默认的名称——"VBAProje ...

  3. Echarts折线图表断点如何补全

    Echarts折线图如何补全断点以及如何隐藏断点的title 做报表的时候,尤其是做图表的时候时常会碰到某一记录的值中缺少某个时间段(比如月份或季度)的值,导致图表显示残缺不全,for example ...

  4. TestFlight使用方法

    1 说明 目前IOS版本APP上架前,很少有项目对上架包进行测试,而上架包是人工打包的,很有可能之前的测试包没有问题,可打出的上架包出现问题.苹果市场是有提供对上架包内部测试的,可以对上架包进行测试, ...

  5. mysql中csv文件的导入导出

    导出例子: select *from testinto outfile 'D:test.csv'fields terminated by ',' optionally enclosed by '&qu ...

  6. java 线程之executors线程池

    一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...

  7. (转)spring学习之@ModelAttribute运用详解

    @ModelAttribute使用详解 1 @ModelAttribute注释方法 例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法执行前被 ...

  8. 【PHP】打印输出var_dump+echo+print_r

    var_dump 判断一个变量的类型与长度如:<?$a = 1;$b = 't';echo var_dump($ta,$tb); // 结果为 int(123) string(3) " ...

  9. business meeting

    Metting are all about discussions . discussion expression 开始会议 Let's get started We need to discuss. ...

  10. 流畅python学习笔记:第十五章:上下文管理器

    在开始本章之前,我们首先来谈谈try-excep..final模块.在Python中,进行异常保护的最多就是用try..except..final.首先来看下下面的代码.进行一个简单的除法运算.为了防 ...