EXPORTED_FUNCTIONS игнорируется во время компиляции emcc
Я пытаюсь узнать, как скомпилировать CPP в WASM, и мне кажется, что он не работает должным образом.
У меня есть простой код CPP, который реализует функцию квадрата, которая возводит в квадрат заданное целое число:
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
int EMSCRIPTEN_KEEPALIVE squarer(int num) {return num * num;}
Я могу скомпилировать это в WASM, но когда я пытаюсь загрузить его в JS, он говорит, что экспортируемых функций нет. Если посмотреть на версию WAT (запустив wasm2wat из wabt), становится ясно, что проблема в том, что функция squarer не экспортируется.
(module
(type $t0 (func (param i32) (result i32)))
(import "env" "__linear_memory" (memory $env.__linear_memory 0))
(import "env" "__indirect_function_table" (table $env.__indirect_function_table 0 funcref))
(func $_Z7squareri (type $t0) (param $p0 i32) (result i32)
(i32.mul
(local.get $p0)
(local.get $p0))))
Поэтому я снова попытался скомпилировать с флагом EXPORTED_FUNCTIONS (см. Следующую строку), но получаю следующее предупреждение, а функция squarer все еще не экспортируется.
$ emcc squarer.cc -o squarer.wasm -c -O1 -s EXPORTED_FUNCTIONS="_Z7squareri","squarer"
emcc: warning: linker setting ignored during compilation: 'EXPORTED_FUNCTIONS' [-Wunused-command-line-argument]
Когда я отредактировал WAT, чтобы включить экспорт (изменив
func $_Z7squareri
к
func (export "squarer")
) и скомпилировал его обратно в WASM, JS успешно загрузил функцию, поэтому кажется, что отсутствие экспорта действительно является проблемой.
Я протестировал его на двух Linux-машинах (на одной установлена ubuntu 20.04, а на другой 18.04, обе с последней версией emsdk, загруженной с их github в соответствии с инструкциями на веб-сайте MDN). Я также пробовал использовать все остальные флаги emcc с "EXPORT" в них, но все они получили одно и то же предупреждение.
Это мой первый раз, когда я создаю модуль WASM, и я узнал все из Интернета, поэтому, возможно, я пропустил какой-то важный шаг. Я что делаю неправильно?
Я использую устаревшие инструменты?
Есть ли лучший / новый компилятор CPP для WASM, который я должен использовать?
Спасибо! Иттай
1 ответ
Параметр командной строки создает объектный файл wasm, который не предназначен для непосредственного выполнения. Затем вам нужно связать этот объектный файл, используя
emcc
(без), чтобы получить окончательный двоичный файл.
Вы можете выполнять как компиляцию, так и компоновку в одной команде, просто удалив
-c
из приведенного выше примера командной строки.
Если вы используете EMSCRIPTEN_KEEPALIVE, вам не нужны EXPORTED_FUNCTIONS в командной строке, поскольку они служат той же цели.