You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用SDL2 + Emscripten时浏览器无法加载本地图片求助

解决Emscripten SDL2移植中资源加载失败的问题

看起来你遇到的核心问题是虚拟文件系统的路径匹配错误,加上编译参数的小疏漏,导致Firefox和Chrome都无法正确加载位图文件。下面是针对你的场景的分步解决方案:

1. 修正代码中的路径大小写问题

Windows本地文件系统不区分大小写,但Emscripten模拟的POSIX虚拟文件系统是严格区分大小写的。你的实际文件夹是大写的RESOURCES,但代码里写的是Resources/hello.bmp,这会导致虚拟FS里找不到对应的文件。

修改代码中的路径行:

std::string imagePath = "RESOURCES/hello.bmp"; // 改为大写的RESOURCES

2. 修复编译命令的参数错误

你的编译命令有两个小问题:

  • 多余的-s前缀:--preload-file是独立参数,不需要前面的-s
  • 不必要的USE_SDL_IMAGE=2:你的代码用的是SDL自带的SDL_LoadBMP,不需要SDL_image库,这个参数可以去掉

另外,为了确保预加载的资源路径和代码中的相对路径完全匹配,建议显式指定虚拟FS中的目标路径(用@符号映射)。

正确的编译命令应该是:

emcc c:/vc/sdl/test.cpp -O2 -s USE_SDL=2 --preload-file c:/vc/sdl/RESOURCES@./RESOURCES -o prueba.html

这个命令会把本地c:/vc/sdl/RESOURCES目录下的所有文件,映射到虚拟FS中当前工作目录的RESOURCES文件夹下,和你代码中的相对路径完全对应。

3. 确保生成文件的完整性

编译完成后,你会得到三个核心文件:prueba.htmlprueba.jsprueba.data必须把这三个文件放在同一个目录下,因为预加载的资源都打包在.data文件里,Emscripten运行时需要正确加载它。

4. 验证Chrome和Firefox的运行

完成以上步骤后:

  • Firefox不会再出现Couldn't open Resources/hello.bmp的错误,因为路径匹配正确了
  • Chrome的异常也会消失,程序会正常启动并渲染位图

如果还是有问题,可以在代码中添加调试代码,打印虚拟FS的当前目录:

#ifdef __EMSCRIPTEN__
#include <emscripten.h>
// 在main函数中添加
const char* currentDir = emscripten_get_current_dir();
std::cout << "Current working directory: " << currentDir << std::endl;
#endif

编译运行后,在浏览器控制台查看输出,确认当前目录和资源路径是否匹配。

内容的提问来源于stack exchange,提问作者Pablo

火山引擎 最新活动