准备工作

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. 虚幻引擎UE4如何制作可拖动(Drag and Drop)的背包(Scrollbox)

    本教程适合初学者(学习经历已有30天的UE4初学者). 最终效果 由于隐私保护,不想截实际的效果图,下面给出了示意图,左边是背包A,右边是背包B,将其中的子项目从左侧拖往右侧的背包,然后在插入位置放置 ...

  2. C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法

    c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...

  3. Java创建连接池连接不同数据库

    在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建 ...

  4. 51nod_1384:全排列(STL)

    题目链接 记住next_permutation函数的用法,另外string在这里比char[]慢好多啊.. //#include<bits/stdc++.h> //using namesp ...

  5. Java IO 之 BIO、NIO、AIO

    1.BIO.NIO.AIO解释 Java BIO : 同步并阻塞 (Blocking IO) 一个连接一个线程 即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不 ...

  6. 一步一步学Vue(五)

    本篇是是vue路由的开篇,会以一个简单的demo对vue-router进行一个介绍,主要覆盖以下几个常用场景: 1.路由跳转 2.嵌套路由 3.路由参数 1.Vue-Router 一般来说,路由定义就 ...

  7. Spring boot——logback 基础使用篇(一)

    1 简单日志配置 spring boot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,Log4J2还有Logb ...

  8. 【echart】学习笔记

    1.  x 轴 y轴 的max  min 只能为5的倍数 2.

  9. Python初识(PyMysql实例)

    为什么学习python呢,好吧,其实我也不知道,反正就是想学习了. 资料什么的全都low了,传值博客免费的就够.不要问我为什么,我基本上都是找的免费的视频.然后传值博客的最多,我真的不是打广告. py ...

  10. iOS与web交互的那些事

    一转眼又是大半年过去了,除了上架了一款新应用外,也没什么进步.所以最近琢磨着搞点事情,不然我那本Java教程都快看完了. 做为一名iOS高(la)阶(ji)法师,几乎所有的任务里,都会出现web这个从 ...