我可以通过运行emcc -O3 -s WASM=1 -s SIDE_MODULE=1 -o sum.wasm sum.c
从以下C代码生成相当小的(203字节)wasm文件。如何使用Rust生成最小化的wasm文件?
#include <emscripten/emscripten.h>
int EMSCRIPTEN_KEEPALIVE sum(int a, int b) {
return a + b;
}
拆输出:
(module
(type $0 (func (param i32 i32) (result i32)))
... trim 9 lines ...
(export "_sum" (func $0))
(func $0 (type $0) (param $var$0 i32) (param $var$1 i32) (result i32)
(i32.add
(get_local $var$1)
(get_local $var$0)
)
)
... trim 17 lines ...
)
但考虑到以下锈代码
pub fn main() {}
#[no_mangle]
pub extern fn sum(a: i32, b: i32) -> i32 {
a + b
}
我似乎无法产生类似的事情。
rustc -O --target=wasm32-unknown-emscripten sum.rs
作品,但给我一个85k wasm文件和一个128k js文件。
我已经试过出口EMMAKEN_CFLAGS='-s WASM=1 -s SIDE_MODULE=1'
但是,让我像
输入文件中的一些警告“/tmp/.../rust.metadata.bin”的存在,但并不适合一个LLVM位码文件为Emscripten。也许意外地将本机构建的目标文件与Emscripten混合?
然后无法链接。
我的铁锈版本是1.22.0-nightly (c6884b12d 2017-09-30)
,我的emcc版本是1.37.21
。
我在做什么错?
哈,搜索的一个星期,我觉得没有什么:
这一目标可以作为setup guide描述中使用。然后几分钟后发布这个问题,我发现[这](https://gist.github.com/LukasKalbertodt/821ab8b85a25f4c54544cc43bed2c39f)可能会回答它。一旦我测试出来,会报告回来。 – zakm
在[此文件](https://github.com/rust-lang/rust/blob/0defa208dcb5a0f3c1ca5bc4df7acf52759ece44/src/librustc_back/target/wasm32_unknown_emscripten.rs)几乎所有关于Rust的emscripten目标都已定义。和[这里](https://github.com/rust-lang/rust/blob/b2f67c8d5676d13d83523316ac95a7056dbd19c6/src/librustc_back/target/mod.rs),评论说可以通过编写一个JSON文件来添加目标(不需要重新编译) rustc!)。所以你可以尝试添加一个自定义目标,它将'SIDE_MODULE'标志传递给emcc。我会写一个适当的答案,但我现在没有时间。对不起:< –