Rust、WebAssembly和增加总内存的参数传递

7
我有一个Rust项目,我正在按照http://asquera.de/blog/2017-04-10/the-path-to-rust-on-the-web/的步骤将其编译为WebAssembly。该项目已经成功编译。但是当我在Chrome Canary中运行它时,它会因内存不足而崩溃,并给出一个非常有用的错误信息。请看下面的内容:
abort("Cannot enlarge memory arrays. Either (1) compile with  -s 
TOTAL_MEMORY=X  with X higher than the current value 16777216, (2) compile 
with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, 
...

问题是,如何将这些标志传递给rustc /构建工具链不太清楚。

无论设置EMMAKEN_CFLAGS还是以下操作都不起作用:

cargo  rustc -v --target=wasm32-unknown-emscripten --release -- -Clink-args="-s TOTAL_MEMORY=33554432" 
1个回答

3
这篇博客提供了一个解决方案,我认为它也可以适用于你的情况:
据我所知,大多数链接器参数无法通过cargo传递。因此,通过指定一个自定义链接器来规避这个限制,实际上该链接器是包装真正的链接器的shell脚本。
创建一个名为emcc_link的shell脚本,使用适当的选项调用emscripten:
emcc "-s" "TOTAL_MEMORY=33554432" $@

你可能需要其他选项来使其运行。有关详细信息,请查看博客文章

然后通过编辑/创建.cargo/config指定将其用于您的项目:

[target.wasm32-unknown-emscripten]
linker = "/your/project/dir/emcc_sdl"

[target.asmjs-unknown-emscripten]
linker = "/your/project/dir/emcc_sdl"

我毫不留情地假设构建环境是Linux或类似系统。在Windows上,shell脚本可能应该是批处理脚本,而且我不确定在.cargo/config中是否有任何区别。

免责声明:我没有尝试过这些方法。


这似乎不起作用。但需要进行一些挖掘以确保。特别是,看起来特殊的链接器从未在项目目录中调用 .cargo/config 文件。 - imichaelmiers
这很难调试... 只要Toml文件有效,cargo就不会抱怨配置文件中的无效设置。如果直接使用-C linker =将链接器传递给rustc会发生什么? - MB-F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接