我正在尝试诊断emcc的链接器问题。我把它归结为以下文件:
#include <setjmp.h>
jmp_buf error;
int main(int argc, char *argv[]) {
int n = setjmp(error);
if (n)
return n;
longjmp(error, 33);
return 0;
}在使用gcc编译时,该文件生成一个a.out,该a.out与预期的代码33一起退出。但是,在用emcc编译时,它在链接步骤中失败,出现以下错误:
nr@homedog ~/s/c [1]> emcc -s LLD_REPORT_UNDEFINED longjmp.c
error: undefined symbol: __invoke_void_$struct___jmp_buf_tag*_i32 (referenced by top-level compiled C/C++ code)
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
warning: ___invoke_void_$struct___jmp_buf_tag*_i32 may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: emscripten_longjmp_jmpbuf (referenced by top-level compiled C/C++ code)
warning: _emscripten_longjmp_jmpbuf may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library将其添加到EXPORTED_FUNCTIONS会导致以下错误:
wasm-ld: error: symbol exported via --export not found: emscripten_longjmp_jmpbuf我需要做些什么来编译这个文件?
我运行Debian稳定(斗牛)与Emscripten版本2.0.12。
ETA:emcc报告版本如下:
nr@homedog ~/s/c [1]> emcc -v
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.12
Debian clang version 11.0.1-2
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /usr/bin发布于 2021-09-01 16:08:53
看起来你有一个不匹配的llvm (clang)和emscripten版本。我们建议使用emsdk安装所有正确的依赖项(如何安装它们?)如果不想使用emsdk,则需要在正确的版本中从源代码构建llvm。
您的示例适用于最新版本的emscripten:
$ emcc -v
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.29-git (6e9e10d3f78eb249bf09922a23e19c3f81a86d0f)
...
$ emcc -s LLD_REPORT_UNDEFINED setjmp.chttps://stackoverflow.com/questions/69016537
复制相似问题