【发布时间】:2016-04-06 07:24:01
【问题描述】:
如何使用 node.js 中的 C++ 库?
【问题讨论】:
-
关键字是
extension。谷歌c++ nodejs extension -
点击此链接。它提供了一个示例程序并逐步进行了解释。 benfarrell.com/2013/01/03/…
标签: javascript c++ node.js binding
如何使用 node.js 中的 C++ 库?
【问题讨论】:
extension。谷歌c++ nodejs extension
标签: javascript c++ node.js binding
尝试shelljs 使用来自 linux/unix 的节点程序调用 c/c++ 程序或共享库。 node-cmd Windows 中的一个选项。这两个包基本上使我们能够调用 c/c++ 程序,类似于我们从终端/命令行调用的方式。
例如在 ubuntu 中:
const shell = require('shelljs');
shell.exec("command or script name");
在窗口中:
const cmd = require('node-cmd');
cmd.run('command here');
注意:shelljs 和 node-cmd 用于运行 os 命令,不特定于 c/c++。
【讨论】:
这是Getting your C++ to the Web with Node.js上的一篇有趣的文章
将 C++ 代码与 Node.js 应用程序集成的三种通用方法 - 虽然每个类别都有很多变化:
- 自动化 - 在子进程中将 C++ 作为独立应用调用。
- 共享库 - 将您的 C++ 例程打包到一个共享库 (dll) 中,并直接从 Node.js 调用这些例程。
- Node.js 插件 - 将您的 C++ 代码编译为原生 Node.js 模块/插件。
【讨论】:
小心 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 文件。
另外,swig 支持 JavaScript 的版本是 swig-3.0.1 或更高版本。
【讨论】:
foo::bar 的定义。类成员的定义都是关于实现的; SWIG 生成的包装器都是关于接口的。
这个问题现在有了新的答案。 SWIG,从 3.0 版开始,似乎为 Node.js、Webkit 和 v8 提供了 javascript interface generators。
一段时间以来,我一直在将 SWIG 广泛用于 Java 和 Python,一旦您了解 SWIG 的工作原理,将 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;
}
};
为了在 node 中使用这个类,你只需编写以下 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 发现了这些东西,并自动生成自然接口.
【讨论】:
std::vector<>,只是 %include "std_vector.i"),您将能够在 javascript 端操作它有点尴尬的方式。请注意,这种方法仍然比自己编写 FFI 更容易、更安全。
你可以使用emscripten将C++代码编译成js。
【讨论】:
看node-ffi。
node-ffi 是一个 Node.js 插件,用于使用纯 JavaScript 加载和调用动态库。它可用于创建与本机库的绑定,而无需编写任何 C++ 代码。
【讨论】:
您可以使用 node.js 扩展来为您的 C++ 代码提供绑定。这是一个涵盖该内容的教程:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
【讨论】: