EM_JS 无法在 emscripten 中导出函数

Posted

技术标签:

【中文标题】EM_JS 无法在 emscripten 中导出函数【英文标题】:EM_JS can't export functions in emscripten 【发布时间】:2020-08-15 02:04:42 【问题描述】:

如果我使用 emscripten 接口,EM_JS 符号似乎没有被导出或任何东西。

如果我使用以下 C 代码:

#include <emscripten.h>
#include <stdio.h>

//Function in javascript Land
extern void writeout( int o );

EM_JS(void, console_logger, (const char* str), 
         console.log(UTF8ToString(str));
 );

void testcallback( int z )

        char ct[100];
        sprintf( ct, "Calling back: %d\n", z );
        console_logger(ct);
        writeout( z+10000 );

如果我尝试使用以下行进行编译,就像这样,这是我的问题。

/home/cnlohr/git/emsdk/upstream/emscripten/emcc -o add2.wasm add2.c -s EXPORTED_FUNCTIONS='["_add2","_testcallback","_console_logger"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' -s ERROR_ON_UNDEFINED_SYMBOLS=0
warning: undefined symbol: writeout (referenced by top-level compiled C/C++ code)
emcc: error: undefined exported function: "_console_logger" [-Wundefined] [-Werror]

我可以尝试不使用它进行编译,如下所示:

/home/cnlohr/git/emsdk/upstream/emscripten/emcc -o add2.wasm add2.c -s EXPORTED_FUNCTIONS='["_add2","_testcallback"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' -s ERROR_ON_UNDEFINED_SYMBOLS=0
warning: undefined symbol: writeout (referenced by top-level compiled C/C++ code)
cat add2.wasm | base64 | ./strencode  > add2.wasm.b64

当我加载它时,我得到了

Uncaught (in promise) LinkError: import object field 'console_logger' is not a Function

如何让 emcc 真正实现我使用 EM_JS 生成的函数?

仅供参考,这是我正在使用的 emcc 版本:

emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.0
clang version 12.0.0 (/b/s/w/ir/cache/git/chromium.googlesource.com-external-github.com-llvm-llvm--project a3036b386383f1c1e9d32c2c8dba995087959da3)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/cnlohr/git/emsdk/upstream/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Candidate multilib: .;@m64
Selected multilib: .;@m64
shared:INFO: (Emscripten: Running sanity checks)

【问题讨论】:

【参考方案1】:

所以,这个问题的答案是,如果您以 .js 文件为目标,则这些函数(以及其他函数)将放在该单独的 js 文件中。如果您不想使用整个文件,可以检查并随意复制。

【讨论】:

以上是关于EM_JS 无法在 emscripten 中导出函数的主要内容,如果未能解决你的问题,请参考以下文章

您是不是必须释放传递给 Emscripten 中导出的 C 函数的字符串?

如何在 React 中使用 Emscripten JavaScript 文件

如何在 React / React Native 中使用 Emscripten 编译的 JavaScript

无法在 Vue 中加载 Emscripten 编译的 C++

Emscripten 无法编译着色器

emscripten + sdl = 抛出异常:TypeError:无法设置未定义的属性“widthNative”