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)
1 ответ
Итак, ответ на этот вопрос заключается в том, что если вы нацеливаетесь на файл.js, эти функции (среди прочего) помещаются в этот отдельный файл js. Вы можете изучить это и волей-неволей скопировать, если не хотите использовать весь файл.