node.jsからC ++ライブラリを使用するにはどうすればよいですか?
node.jsからC ++ライブラリを使用するにはどうすればよいですか?
回答:
node-ffiを見てください。
node-ffiは、純粋なJavaScriptを使用して動的ライブラリをロードおよび呼び出すためのNode.jsアドオンです。C ++コードを記述せずにネイティブライブラリへのバインディングを作成するために使用できます。
今、その質問に対する新鮮な答えがあります。SWIG、バージョン3.0の時点でJavaScriptインターフェースジェネレーターを提供しているようです、Node.js、Webkit、およびv8用のです。
私はしばらくの間、JavaとPythonでSWIGを広範囲に使用しており、SWIGがどのように機能するかを理解すれば、C ++コードをSWIGが実行する言語とインターフェイスするために必要な作業はほとんどありません(ターゲット言語の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;
}
};
このクラスをノードで使用するには、次の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を自分で作成するよりも簡単で安全です。
node.js拡張機能を使用して、C ++コードのバインディングを提供できます。これをカバーするチュートリアルは次のとおりです。
http://syskall.com/how-to-write-your-own-native-nodejs-extension
emscriptenを使用してC ++コードをjsにコンパイルできます。
Node.jsを使用してC ++をWebに移行することに関する興味深い記事を以下に示します。
C ++コードをNode.jsアプリケーションと統合する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以降です。
foo::bar
とにかくSWIGがどう定義するのか理解できません。クラスメンバーの定義は、すべて実装に関するものです。SWIGが生成するラッパーはすべてインターフェイスに関するものです。
extension
です。Google c ++ nodejs拡張