使用从node.js编译的emscripten C库

遵循emscripten wiki上的说明之后,我设法编译了一个小的C库。 这导致了一个a.out.js文件。

我假设从这个库(在node.js中)使用函数可以这样工作:

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

然而这失败了。 任何人都可以帮助或指向我一些相关的基本教程?

这里的问题是你的a.out.js文件看起来像这样

 function myFunction() { ... } 

不是这样的

 function myFunction() { ... } exports.myFunction = myFunction; 

您需要编写一个构build脚本,列出您想要从每个C程序公开导出的令牌,并将exports.<token> = <token>;\n附加到每个令牌的文件末尾exports.<token> = <token>;\n

其实所有的function都已经出口了 生成的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" { … }扩展出来是明智的select。

而且,这种直接的方法需要JS到Ctypes的转换 。 您可能希望通过在添加了--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 } } 

所有Emscripten生成的好东西都会稍后增强Module对象,所以不要担心它在这里定义,而不是修改。

最后,你一定会考虑Embind ,这是一个揭示Emscripten提供的漂亮的JavaScript API的机制。 (需要禁用最新的fastcomp后端。)

Interesting Posts