按照关于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