我可以通過運行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。我會寫一個適當的答案,但我現在沒有時間。對不起:< –