如何使用node.js中的C ++库?

时间:2012-03-09 06:07:36

标签: javascript c++ node.js binding

如何使用node.js中的C ++库?

8 个答案:

答案 0 :(得分:76)

现在对这个问题有一个新的答案。 SWIG,从版本3.0开始,似乎为Node.js,Webkit和v8提供了javascript interface generators

我已经将SWIG广泛用于Java和Python一段时间了,一旦你理解了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发现这些东西,并自动生成自然界面。

答案 1 :(得分:61)

请看node-ffi

  

node-ffi是一个Node.js插件,用于使用纯JavaScript加载和调用动态库。它可用于创建与本机库的绑定,而无需编写任何C ++代码。

答案 2 :(得分:19)

您可以使用node.js扩展名为您的C ++代码提供绑定。这是一个涵盖该内容的教程:

http://syskall.com/how-to-write-your-own-native-nodejs-extension

答案 3 :(得分:10)

您可以使用emscripten将C ++代码编译为js。

答案 4 :(得分:2)

有更新的方法来连接Node.js和C ++。请在Nan抢劫。

修改 最快最简单的方法是nbind。如果要编写异步附加组件,可以组合来自nan的Asyncworker类。

答案 5 :(得分:1)

Getting your C++ to the Web with Node.js

上有一篇有趣的文章
  

将C ++代码与Node.js应用程序集成的三种通用方法   -尽管每个类别中都有很多变体:

     
      
  1. 自动化-在子进程中将C ++作为独立应用程序调用。
  2.   
  3. 共享库-将C ++例程打包到共享库(dll)中,然后直接从Node.js调用这些例程。
  4.   
  5. Node.js插件-将您的C ++代码作为本机Node.js模块/插件编译。
  6.   

答案 6 :(得分:0)

使用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或更高版本。

答案 7 :(得分:0)

尝试shelljs通过使用linux / unix中的节点程序来调用c / c ++程序或共享库。 node-cmd Windows中的一个选项。基本上,这两个软件包都使我们能够调用c / c ++程序,类似于从终端/命令行调用的方式。

例如在Ubuntu中:

const shell = require('shelljs');

shell.exec("command or script name");

在Windows中:

const cmd = require('node-cmd');
cmd.run('command here');

注意:shelljs和node-cmd用于运行os命令,而不特定于c / c ++。