当我使用-s ASYNCIFY = 1编译Emscripten代码并调用外部库类时,我遇到了问题。
_setjmpTable
Assertion failed: mappedGlobals.find(name) != mappedGlobals.end() ? true : (std::cerr << name.str << '\n', false), file C:\emslave\buildslave\win-tagbuilder\emsdk\binaryen\tag-1.38.29\src\asm2wasm.h, line 1659
shared:ERROR: 'C:/workspace/emsdk/clang/e1.38.29_64bit/binaryen\bin\asm2wasm hello.temp.asm.js --total-memory=16777216 --trap-mode=allow -O3 --mem-init=hello.js.mem --mem-base=1024 --wasm-only -o hello.wasm --mvp-features' failed (-1073740791)
在emscripten github问题here中提到了这个问题
问题是因为
asyncify传递将一些代码移出main,然后它找不到那些本地变量
正如Emscripten的作者所说
当我从外部库(.bc)调用其他类并使用ASYNCIFY = 1进行编译时,会出现问题。但是,当我删除ASYNCIFY时,一切都没问题。
我还发现如果我之前添加代码
jmp_buf env;
if(!setjmp(env))
{
longjmp(env,1);
emscripten_sleep(1000);
}
代码可以成功编译,但是当我在浏览器上运行它时崩溃了
如何解决这个问题,因为我必须同时使用ASYNCIFY和外部库中的类?
当我使用emscripten_wget(...)
与-s ASYNCIFY=1
时,我有同样的问题。我不得不使用emscripten_async_wget
,它不需要ASYNCIFY。
附:我使用emscripten版本1.38.29。
根据this,ASYNCIFY是一个已知的bug
在例外和setjmp之类的东西上有一些已知的ASYNCIFY错误。 emterpreter尚未在这些功能上进行过测试,因此目前还不清楚它是否可行。更新:当堆栈上存在try-catch(llvm调用)时,执行和异步操作存在已知问题。
使用EMTERPRETIFY而不是ASYNCIFY
FLAGS += -s EMTERPRETIFY_FILE="data.binary"
FLAGS += -s EMTERPRETIFY=1
FLAGS += -s EMTERPRETIFY_ASYNC=1
代替
当我用WASM = 0禁用webassembly时 它也可以正常工作