如何使用emcc编译longjmp?
How to compile longjmp using emcc?
我正在尝试诊断 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
并按预期以代码 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 稳定版(bullseye),Emscripten 版本 2.0.12。
预计到达时间: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
您的 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.c
我正在尝试诊断 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
并按预期以代码 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 稳定版(bullseye),Emscripten 版本 2.0.12。
预计到达时间: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
您的 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.c