按照emscripten wiki上的说明操作后,我设法编译了一个小型C库.这导致了一个a.out.js文件.
我假设要使用这个库中的函数(在node.js中)这样的东西会起作用:
var lib = require("./a.out.js");
lib.myFunction('test');
Run Code Online (Sandbox Code Playgroud)
然而,这失败了.任何人都可以帮助或指出一些与此相关的基本教程吗?
实际上,所有功能都已导出.生成的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后端.)
这里的问题是你的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每个标记附加到文件的末尾.
| 归档时间: |
|
| 查看次数: |
4985 次 |
| 最近记录: |