#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
В этом режиме вы не должны видеть экспорт с именем уменьшенный.