2012-01-26 11 views
5

emscripten wikiの指示に従うと、私は小さなCライブラリをコンパイルすることができました。これにより、a.out.jsファイルが作成されました。node.jsのemscriptenコンパイル済みCライブラリを使用する

私はこのような何かが働いているだろう(Node.jsの中に)このライブラリから関数を使用することを想定した。しかし、これが失敗した

var lib = require("./a.out.js"); 
lib.myFunction('test'); 

を。誰も助けたり、これに関連する基本的なチュートリアルを教えてくれますか?

答えて

7

ここでの問題は、あなたのa.out.jsファイルはあなたが公にしたいトークンを示しビルドスクリプトを記述する必要があり、この

function myFunction() { 
    ... 
} 

exports.myFunction = myFunction; 

が好きではありません。この

function myFunction() { 
    ... 
} 

見えるように起こっているということです各Cプログラムからエクスポートし、各トークンのファイルの最後にexports.<token> = <token>;\nを追加します。

+1

調査の結果、emscripten wikiページの[コードとの対話](https://github.com/kripken/emscripten/wiki/Interacting-with-code)の解決策が見つかりました。 '、**輸出を組み合わせる。 ** Pointer_stringify **および** allocate **機能を使用すると、ジョブは実行されます – lostsource

+0

@lostsource私は例を表示できますか? – noamtcohen

6

実際には、すべての機能が既にエクスポートされています。生成されたJavaScriptは、次の行が含まれています。

var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; 
// … 

if (ENVIRONMENT_IS_NODE) { 
    // … 
    module['exports'] = Module; 
} 

あなたのCコードでmy_funと呼ばれる機能を持っている場合、あなたはModule._my_funが定義されています。

しかし、このアプローチにはいくつかの問題があります。

オプティマイザは一部の機能を削除したり名前を変更したりする可能性がありますので、常に-s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']"を指定してください。 C++の関数のシグネチャはビットマングルされているので、エクスポートするのはextern "C" { … }です。

また、このような直接的アプローチrequires JS to C type conversions。あなたは--pre-jsオプションで添付追加したファイルにさらに別のAPI層を追加することによって、それを非表示にすることがあります。

var Module = { 
    my_fun: function(some_arg) { 
    javascript to c conversion goes here; 
    Module._my_fun(converted_arg) // or with Module.ccall 
    } 
} 

Moduleオブジェクトは、後にすべてのEmscripten-生成グッズによって強化されるので、それはここで定義されていますことを心配しないでください、変更されていない。

最後に、Emscriptenが提供するすてきなJavaScript APIを公開するためのメカニズムであるEmbindを必ず考慮してください。