web-dev-qa-db-ja.com

node.jsからC ++ライブラリを使用するにはどうすればよいですか?

Node.jsからC++ライブラリを使用するにはどうすればよいですか?

124
MaiaVictor

node-ffi を見てください。

node-ffiは、純粋なJavaScriptを使用して動的ライブラリをロードおよび呼び出すためのNode.jsアドオンです。 C++コードを記述せずにネイティブライブラリへのバインディングを作成するために使用できます。

61
Vadim Baryshev

今、その質問に対する新しい答えがあります。 SWIG 、バージョン3.0の時点で javascriptインターフェイスジェネレーターを提供しているようです Node.js、Webkit、およびv8用。

私はしばらくの間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メソッドをどこにも記述しなくてもよいことに注意してください。インターフェース。

77
enobayram

Node.js拡張機能を使用して、C++コードのバインディングを提供できます。これをカバーする1つのチュートリアルを次に示します。

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

19
Alex

emscripten を使用して、C++コードをjsにコンパイルできます。

11
N3UR0CHR0M

Node.jsとC++を接続する新しい方法があります。 Nan で略奪してください。

EDIT最速かつ最も簡単な方法は nbind です。非同期アドオンを作成する場合は、nanのAsyncworkerクラスを組み合わせることができます。

2

Node.jsを使用してC++をWebに接続する に関する興味深い記事を次に示します。

node.jsアプリケーションとC++コードを統合する3つの一般的な方法-各カテゴリ内には多くのバリエーションがあります。

  1. オートメーション-C++を子プロセスのスタンドアロンアプリとして呼び出します。
  2. 共有ライブラリ-C++ルーチンを共有ライブラリ(dll)にパックし、それらのルーチンをNode.jsから直接呼び出します。
  3. Node.jsアドオン-C++コードをネイティブNode.jsモジュール/アドオンとしてコンパイルします。
1
sreepurna

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++クラスが1つの.hファイルのみに制限されることはめったにありません。

また、JavaScriptをサポートするswigのバージョンはswig-3.0.1以降です。

0
Anton