Emscripten
编译 C/C++(任何使用 LLVM 的语言) 到 WASM
1. `emcc` 首先将 C/C++ 代码编译成 LLVM IR(Intermediate Representation)。
2. 然后,`emcc` 使用 `llc` 工具将 LLVM IR 编译成目标机器的汇编代码。
3. 接着,`emcc` 使用 `s2wasm` 工具将汇编代码转换成 WebAssembly 二进制格式。
4. 最后,`emcc` 使用 `wasm-opt` 工具对 WebAssembly 模块进行优化,以提高性能和减小文件大小。
// 编译 Rust 指定 target 为 wasm32-unknown-emscripten
// 指定链接时参数:rustflags = ["-C", "link-args=-sEXPORT_ES6", "-C", "link-args=-sEXPORT_NAME=loadWASM"]
// -g2 保持原符号名称用于调试
Module['wasmBinary'] 指定 wasm 文件内容
Module.onRuntimeInitialized 表示 wasm 准备好的回调
git clone https://github.com/juj/emsdk.git
cd emsdk
# on Linux or Mac OS X
./emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit
./emsdk activate --global --build=Release sdk-incoming-64bit binaryen-master-64bit
# on Windows
emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit
emsdk activate --global --build=Release sdk-incoming-64bit binaryen-master-64bit
# on Linux or Mac OS X
# 每次执行,在当前 shell 中使用 emcc
source ./emsdk_env.sh
# on Windows
emsdk_env.bat
emcc hello.c -s WASM=1 -o hello.html
hello.js 中输出 Module 对象;
Module.onRuntimeInitialized