我想用JavaScript轻松使用C源代码(仅使用免费/ libre软件)。所以Emscripten似乎是个不错的选择。 https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html
有一个例子可以导出一个函数:
emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']"
但是有许多功能与JavaScript中使用相关。而且,似乎我将不得不为访问结构成员添加更多内容。 Accessing struct fields from emscripten
所以,我想知道是否可以导出所有函数(除了libc之外)而不创建包含所有名称的大数组,即使它可能是JS大小问题和效率问题。
问候。
答案 0 :(得分:4)
导出所有功能的一种方法是在编译时同时使用-s LINKABLE=1
https://github.com/kripken/emscripten/blob/1.34.12/src/settings.js#L461和-s EXPORT_ALL=1
https://github.com/kripken/emscripten/blob/1.34.12/src/settings.js#L385选项。
emcc tests/hello_function.cpp -o function.html -s LINKABLE=1 -s EXPORT_ALL=1
让-s EXPORT_ALL=1
确实有效,但在我的系统上会产生以下警告:
warning: unresolved symbol: remquof
warning: unresolved symbol: ilogb
warning: unresolved symbol: nextafter
warning: unresolved symbol: remquo
warning: unresolved symbol: fesetround
warning: unresolved symbol: llvm_fma_f64
但是,这并不能完全满足您的需求,因为也会导出libc函数。例如,您可以致电
Module.ccall('printf', 'number', ['string'], ['Passing a string from Javascript to C\n');
很好,它会将字符串发送到标准输出(默认情况下只是浏览器控制台)。
此答案基于@zakki's answer。
答案 1 :(得分:2)
只有部分答案。为避免维护函数数组,可以在定义函数时使用EMSCRIPTEN_KEEPALIVE宏
void EMSCRIPTEN_KEEPALIVE my_function()
{
printf("I am being kept alive\n");
}
的文档中看到这一点
不可否认,这不会导出所有函数,只会导出标有EMSCRIPTEN_KEEPALIVE的函数。
答案 2 :(得分:1)
使用-s EXPORT_ALL=1
。
如果为true,我们会导出所有符号。请注意,不会影响LLVM,因此它仍然可以消除死机功能。这只是将它们导出到Module对象上。
https://github.com/kripken/emscripten/blob/master/src/settings.js#L300