如何使用node.js中的C++库
How can I use a C++ library from node.js?
如何使用node.js中的C++库?
现在这个问题有了新的答案。SWIG,从3.0版本开始,似乎为Node.js、Webkit和v8提供了javascript接口生成器。
一段时间以来,我一直在Java和Python中广泛使用SWIG,一旦您了解了SWIG的工作原理,就几乎不需要付出任何努力(与目标语言中的ffi或等效语言相比)将C++代码与SWIG支持的语言进行接口连接。
举个小例子,假设您有一个标题为myclass.h:的库
#include<iostream>
class MyClass {
int myNumber;
public:
MyClass(int number): myNumber(number){}
void sayHello() {
std::cout << "Hello, my number is:"
<< myNumber <<std::endl;
}
};
为了在节点中使用这个类,您只需编写以下SWIG接口文件(mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
创建绑定文件binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
运行以下命令:
swig -c++ -javascript -node mylib.i
node-gyp build
现在,从同一个文件夹运行节点,您可以执行以下操作:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
尽管我们需要为这样一个小示例编写2个接口文件,但请注意,我们在任何地方都不必提及MyClass
构造函数或sayHello
方法,SWIG发现了这些东西,并自动生成自然接口。
查看节点ffi。
node-ffi是一个node.js插件,用于使用纯JavaScript加载和调用动态库。它可以用于创建到本机库的绑定,而无需编写任何C++代码。
您可以使用emscripten将C++代码编译成js。
有新的连接Node.js和C++的方法。求你了,在楠那里抢劫。
编辑最快最简单的方法是nbind。如果你想写异步插件,你可以结合nan的Asyncworker
类。
这是一篇关于使用Node.js 将C++移植到Web的有趣文章
将C++代码与Node.js应用程序集成的三种通用方法-尽管每个类别中都有很多变化:
- 自动化-将您的C++作为子进程中的独立应用程序调用
- 共享库-将C++例程打包到共享库(dll)中,并直接从Node.js调用这些例程
- Node.js插件-将C++代码编译为本地Node.js模块/插件
尝试使用linux/unix中的节点程序来调用c/c++程序或共享库。nodecmd窗口中的一个选项。这两个包基本上都使我们能够调用c/c++程序,类似于我们从终端/命令行调用的方式。
例如在ubuntu:
const shell = require('shelljs');
shell.exec("command or script name");
在窗口中:
const cmd = require('node-cmd');
cmd.run('command here');
注意:shelljs和nodecmd用于运行os命令,而不是特定于c/c++。
精通swig和C++:http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
不建议在C++源文件(出现在.C或.cxx文件中的文件)上运行SWIG。尽管SWIG可以解析C++类声明,但它会忽略与原始类定义解耦的声明(声明会被解析,但可能会生成大量警告消息)。例如:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
很少有C++类只限于一个.h文件。
此外,支持JavaScript的swig版本为swig-3.0.1或更高版本。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 用C++中的一个变量定义一个常量
- vector.resize()中的分配错误
- 使用指针从C++中的数组中获取最大值
- arr[-1]在c++中的奇怪行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 将值指定给向量(2D)的向量中的某个位置
- 内置函数可查看CPP中的成员变量