Javascript 使用Emscripten导出所有函数
我想用JavaScript简单地使用C源代码(只使用免费的/libre软件)。因此,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函数除外),而不创建一
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本机不支持的任何类型。不过,只要您坚持使用内置类型,就应该是直截了当的(而且我相信已经有人构建了一个脚本来实现这一点)。这需要对现有的源代码进行注释,这对于大型第三方库来说可能很难做到。