按照關於emscripten wiki的說明,我設法編譯了一個小型C庫。這導致了一個a.out.js文件。從node.js使用emscripten編譯的C庫
我假設使用的功能,從這個庫(node.js的範圍內),這樣的事情會工作:
var lib = require("./a.out.js");
lib.myFunction('test');
但是這個失敗。任何人都可以幫助或指向我一些與此相關的基本教程?
按照關於emscripten wiki的說明,我設法編譯了一個小型C庫。這導致了一個a.out.js文件。從node.js使用emscripten編譯的C庫
我假設使用的功能,從這個庫(node.js的範圍內),這樣的事情會工作:
var lib = require("./a.out.js");
lib.myFunction('test');
但是這個失敗。任何人都可以幫助或指向我一些與此相關的基本教程?
這裏的問題是,你的a.out.js
文件是要這個樣子
function myFunction() {
...
}
不喜歡這個
function myFunction() {
...
}
exports.myFunction = myFunction;
你需要寫一個構建腳本,列出你想要的令牌公開從每個C程序導出,並將exports.<token> = <token>;\n
附加到每個令牌的文件末尾。
實際上,所有的功能都已經導出。生成的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。您可能希望通過在文件中添加另一個API層加入附有--pre-js
選項來隱藏:
var Module = {
my_fun: function(some_arg) {
javascript to c conversion goes here;
Module._my_fun(converted_arg) // or with Module.ccall
}
}
Module
對象將通過所有的Emscripten生成的東西在後面增強,所以不用擔心它在這裏定義,沒有修改。
最後,你一定會考慮Embind這是一個揭露Emscripten提供的漂亮的JavaScript API的機制。 (需要禁用最新的fastcomp後端。)
經過一番研究,我在emscripten wiki頁面上找到了解決方案'[與代碼交互](https://github.com/kripken/emscripten/wiki/Interacting-with-code) ',結合**出口。 **使用** Pointer_stringify **和**分配**功能完成作業 –
lostsource
@lostsource您可以向我展示一個示例嗎? – noamtcohen