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

los*_*rce 5 clang node.js

按照emscripten wiki上的说明操作后,我设法编译了一个小型C库.这导致了一个a.out.js文件.

我假设要使用这个库中的函数(在node.js中)这样的东西会起作用:

var lib = require("./a.out.js");
lib.myFunction('test');
Run Code Online (Sandbox Code Playgroud)

然而,这失败了.任何人都可以帮助或指出一些与此相关的基本教程吗?

ska*_*lee 8

实际上,所有功能都已导出.生成的JavaScript包含以下行:

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

if (ENVIRONMENT_IS_NODE) {
  // …
  module['exports'] = Module;
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个my_fun在你的C代码中调用的函数,那么你将Module._my_fun定义.

但是,这种方法存在一些问题.

优化程序可能会删除或重命名某些函数,因此请始终指定它们通过-s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']".C++中的函数签名有点破坏,因此对于extern "C" { … }要导出的函数签名是明智的.

此外,这种直接方法需要JS到C类型的转换.您可能希望通过添加附加了--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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

最后,您一定要考虑使用Embind,这是一种公开Emscripten提供的优秀 JavaScript API的机制.(需要禁用最新的fastcomp后端.)


Ray*_*nos 7

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

function myFunction() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

不是这样的

function myFunction() {
  ...
}

exports.myFunction = myFunction;
Run Code Online (Sandbox Code Playgroud)

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