Windows下使用emscripten将Rust编译为WebAssembly报错如何解决
错误根因
你遇到的__gxx_personality_v0未定义报错,是因为Rust默认开启的panic unwind机制依赖C异常处理相关符号,而Emscripten默认编译链路没有引入C标准库,同时你使用的Rust 1.52版本和Emscripten 2.0.20版本存在配置兼容性问题。
修复方案
方案1(优先推荐)
直接关闭Rust的unwind逻辑,从根源消除对C++异常符号的依赖,同时产物体积更小。
- 在项目根目录创建
.cargo文件夹,在文件夹内新建config.toml文件,写入如下内容:
[target.wasm32-unknown-emscripten] rustflags = [ "-C", "panic=abort", "-C", "link-arg=-sDISABLE_EXCEPTION_CATCHING=1" ]
- 重新执行编译命令即可:
cargo build --target wasm32-unknown-emscripten
方案2(保留panic unwind能力)
如果业务需要保留unwind能力,可直接给emcc传递链接C++标准库的参数,执行如下编译命令即可:
cargo rustc --target wasm32-unknown-emscripten -- -C link-arg=-lc++
注意事项
如果执行操作后仍报错,先确认当前终端的Emscripten环境变量是否生效:执行emcc -v能正常输出版本即为生效,否则需要重新运行emsdk目录下的emsdk_env.bat加载环境变量。
内容的提问来源于stack exchange,提问作者kochizufan
相关产品推荐
相关产品推荐

