我该如何在node.js中使用C++库?
现在这个问题有了一个新的答案。SWIG,从版本3.0开始似乎为Node.js、Webkit和v8提供了javascript接口生成器。
我已经长期使用SWIG来处理Java和Python代码,并且一旦你理解了SWIG的工作原理,与SWIG支持的语言进行C ++代码接口开发的工作量(与ffi或目标语言中的等效项相比)几乎可以忽略不计。
举个小例子,假设你有一个带有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
现在,从相同的文件夹中运行node,你可以执行以下操作:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
即使我们需要为如此简单的示例编写两个接口文件,但请注意,我们不必在任何地方提及MyClass
构造函数或sayHello
方法,SWIG会发现这些东西,并自动生成自然的接口。
std::vector<>
,只需 %include "std_vector.i"
),然后你就可以以某种笨拙的方式在Javascript端操作它了。请注意,这种方法仍然比自己编写 FFI 更容易且更安全。 - enobayram看看node-ffi。
node-ffi 是一个使用纯 JavaScript 加载和调用动态库的 Node.js 插件。它可用于创建与本地库的绑定,而无需编写任何 C++ 代码。
您可以使用emscripten将C++代码编译为js。
const shell = require('shelljs');
shell.exec("command or script name");
const cmd = require('node-cmd');
cmd.run('command here');
Running SWIG on C++ source files (what would appear in a .C or .cxx file) is not recommended. Even though SWIG can parse C++ class declarations, it ignores declarations that are decoupled from their original class definition (the declarations are parsed, but a lot of warning messages may be generated). For example:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
很少有C++类只限于一个.h文件。
此外,支持JavaScript的swig版本为swig-3.0.1或更高版本。
foo::bar
的定义。类成员的定义都是关于实现的;SWIG 生成的包装器则是关于接口的。 - enobayram
extension
。搜索c++ nodejs extension
,获取相关结果。 - Peter Wood