Я использую WASM через emscripten уже несколько недель и добился хороших результатов, пока не появилась эта ошибка:
exception thrown: RuntimeError: function signature mismatch,RuntimeError: function signature mismatch
Это начало происходить в коде, который раньше работал, и, похоже, это как-то связано с отсутствием поддержки WASM 64-битных целых чисел в javascript и смещениями, используемыми в управлении файлами. Я сделал отдельный случай:
#include <iostream>
int main(int argc, char const *argv[])
{
char test[30];
std::cout << __LINE__ << std::endl;
FILE *f = fopen("minimal_call_dispatch.cpp","ra");
std::cout << __LINE__ << std::endl;
fseek(f, 100, SEEK_SET);
std::cout << __LINE__ << std::endl;
fclose(f);
std::cout << __LINE__ << std::endl;
return 0;
}
здание с:
call emcc -o ./test.js test_file.cpp -s WASM=1 -s NO_EXIT_RUNTIME=1 -std=c++1z
Который выводит «6\n8\n» перед сбоем «fseek» из-за упомянутой ошибки.
Где-то я подозреваю, что wasm пытается использовать заголовки, взаимодействующие с javascript, которые имеют 64-битные целые числа вместо 32-битных, но я не понимаю, как это могло произойти. Я собираюсь попробовать переустановить emscripten, но даже если это сработает, я хотел бы лучше понять, в чем причина.
В качестве обходного пути, кто-нибудь знает, как заставить emcc игнорировать заботы о 64-битных целых числах и молча преобразовывать их в 32-битные? В конце концов, я не собираюсь использовать более 3 гигабайт оперативной памяти.
minimal_call_dispatch.cpp
, который ты открываешь? Вы открываете файл, который вы отправили, или вы создаете файл? - person Bumsik Kim   schedule 16.01.2020