Emscripten生成的HTML无法打开,Wasm二进制需预加载问题求助
解决Wasm页面加载时的预加载错误问题
嘿,我碰到过一模一样的问题!让我来帮你搞定它。
首先得确认:你的C代码和编译命令本身完全没问题。先把你的代码和命令贴出来给大家参考:
你的C代码:
#include <stdio.h> int main(int argc, char ** argv) { printf("Hello World\n"); }
编译命令:
emcc helloWorld.c -s WASM=1 -o helloWorld.html
问题出在直接用浏览器打开本地生成的helloWorld.html文件上。
为什么会报错?
浏览器在处理file://协议(也就是直接打开本地文件)时,会限制很多网络相关的操作。而emcc生成的HTML默认会尝试通过网络请求预加载对应的.wasm二进制文件,这在本地文件系统下是不被允许的,所以就抛出了那个预加载失败的错误。
两种快速解决方法:
方法1:用本地HTTP服务器运行(最推荐)
这是Wasm运行的标准环境,能避免大部分本地文件协议的限制:
- 如果你的电脑装了Python,直接在项目目录下运行:
然后打开浏览器访问# Python 3版本 python -m http.server 8000 # Python 2版本 python -m SimpleHTTPServer 8000http://localhost:8000/helloWorld.html,就能在控制台看到"Hello World"的输出了。 - 如果用Node.js,可以先安装
http-server工具:
然后在项目目录下运行npm install -g http-serverhttp-server,访问控制台提示的地址(一般是http://localhost:8080)即可。
方法2:编译时将Wasm打包进HTML文件
如果不想用服务器,也可以让emcc把Wasm二进制直接内嵌到HTML里,这样就能直接双击打开文件运行:
修改编译命令,加上-s SINGLE_FILE=1参数:
emcc helloWorld.c -s WASM=1 -s SINGLE_FILE=1 -o helloWorld.html
生成的HTML文件会把Wasm内容内嵌为base64格式,直接打开就能正常运行。
内容的提问来源于stack exchange,提问作者Clint
相关产品推荐
相关产品推荐

