EM_JS无法导出emscripten中的函数

问题描述

如果我使用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)

解决方法

因此,答案是,如果您以.js文件为目标,则这些功能(以及其他功能)将放在该单独的js文件中。您可以检查一下,如果不想使用整个文件,可以随意复制。