Node.jsからC++ライブラリを使用するにはどうすればよいですか?
node-ffi を見てください。
node-ffiは、純粋なJavaScriptを使用して動的ライブラリをロードおよび呼び出すためのNode.jsアドオンです。 C++コードを記述せずにネイティブライブラリへのバインディングを作成するために使用できます。
今、その質問に対する新しい答えがあります。 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
メソッドをどこにも記述しなくてもよいことに注意してください。インターフェース。
Node.js拡張機能を使用して、C++コードのバインディングを提供できます。これをカバーする1つのチュートリアルを次に示します。
http://syskall.com/how-to-write-your-own-native-nodejs-extension
emscripten を使用して、C++コードをjsにコンパイルできます。
Node.jsを使用してC++をWebに接続する に関する興味深い記事を次に示します。
node.jsアプリケーションとC++コードを統合する3つの一般的な方法-各カテゴリ内には多くのバリエーションがあります。
- オートメーション-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++クラスが1つの.hファイルのみに制限されることはめったにありません。
また、JavaScriptをサポートするswigのバージョンはswig-3.0.1以降です。