Есть ли простой способ попросить emscripten испускать wasm и не искажать его названия?

#c #webassembly #emscripten

#c #веб-узел #эмскриптен

Вопрос:

Вот мой код на языке Си:

 #include lt;emscripten.hgt; #ifdef __cplusplus extern "C" { #endif  EMSCRIPTEN_KEEPALIVE int add(int a, int b) {  return a   b; } #ifdef __cplusplus } #endif  

Я запускаю его с помощью такой команды: emcc -O3 add.c -s EXPORTED_FUNCTIONS=_add , это дало мне вывод wasm, который близок к тому, что я хочу, но имя искажено, сброшенный вывод выглядит примерно так, как показано ниже:

  Type[2]:  - type[0] () -gt; nil  - type[1] (i32, i32) -gt; i32 Function[2]:  - func[0] sig=0 lt;bgt;  - func[1] sig=1 lt;cgt; Table[1]:  - table[0] type=funcref initial=1 max=1 Memory[1]:  - memory[0] pages: initial=256 max=256 Export[4]:  - memory[0] -gt; "a"  - func[0] lt;bgt; -gt; "b"  - func[1] lt;cgt; -gt; "c"  - table[0] -gt; "d" Code[2]:  - func[0] size=3 lt;bgt;  - func[1] size=7 lt;cgt;  

Вот c искореженный add , есть ли какой-нибудь способ сказать emcc, чтобы он не искажал свое название?

Ответ №1:

Библиотека JS, выводимая emscripten, экспортирует незамутненное имя, чтобы вы все еще могли использовать его извне.

Для экономии места имена, экспортированные из wasm в JS, уменьшены, но JS знает, что затем их следует экспортировать во внешний мир по их первоначальному имени. Вы можете рассматривать эти экспортные данные из WebAssembly как внутренний контракт между JS и WebAssembly, созданный emscripten. Они не предназначены для прямого доступа к вам.

Если вы хотите, чтобы emscripten создавал модуль веб-сборки, предназначенный для прямого/внешнего использования, и вы не хотите, чтобы emscripten создавал код загрузчика JS, вы можете вывести автономный файл wasm, используя один из следующих методов:

  • Укажите имя вывода, которое заканчивается .wasm (например -o out.wasm )
  • Проходить -sSTANDALONE_WASM

В этом режиме вы не должны видеть экспорт с именем уменьшенный.