Emscripten

Tags
emscriptenwasm
Created
Jun 24, 2017 9:26 PM

编译 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 保持原符号名称用于调试

https://emscripten.org/docs/api_reference/module.html

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

SuperMade with Super