Javascript 使用Emscripten导出所有函数

Javascript 使用Emscripten导出所有函数,javascript,llvm,emscripten,Javascript,Llvm,Emscripten,我想用JavaScript简单地使用C源代码(只使用免费的/libre软件)。因此,Emscripten似乎是一个不错的选择 下面是一个导出一个函数的示例: emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']" 但是有许多函数与JavaScript中的使用相关。此外,我似乎还需要添加一些内容,以便访问结构的成员 因此,我想知道是否有可能导出所有函数(libc函数除外),而不创建一

我想用JavaScript简单地使用C源代码(只使用免费的/libre软件)。因此,Emscripten似乎是一个不错的选择

下面是一个导出一个函数的示例:

emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']"
但是有许多函数与JavaScript中的使用相关。此外,我似乎还需要添加一些内容,以便访问结构的成员

因此,我想知道是否有可能导出所有函数(libc函数除外),而不创建一个包含所有名称的大数组,即使这可能是一个JS大小和效率问题


问候。

只回答了部分问题。为了避免维护函数数组,可以在定义函数时使用EMSCRIPTEN_KEEPALIVE宏

void EMSCRIPTEN_KEEPALIVE my_function()
{
  printf("I am being kept alive\n");
}
您可以在以下位置的文档中看到这一点:


诚然,这并不是导出所有函数,只是那些标有EMSCRIPTEN_KEEPALIVE的函数。

使用
-s export_all=1

如果为true,则导出所有符号。请注意,这不会影响LLVM,因此它仍然可以消除死函数。这只是在模块对象上导出它们


导出所有函数的方法是在编译时同时使用
-s LINKABLE=1
-s export\u all=1
选项

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');
很好,它会将字符串发送到标准输出(默认情况下只是浏览器控制台)



此答案基于。

对于文件中的所有函数,自动化此过程的挑战在于您是否使用了Emscripten本机不支持的任何类型。不过,只要您坚持使用内置类型,就应该是直截了当的(而且我相信已经有人构建了一个脚本来实现这一点)。这需要对现有的源代码进行注释,这对于大型第三方库来说可能很难做到。