如何将C++文件编译为WebAssembly?

sdg*_*sdh 30 c++ webassembly

假设我有一个简单的,独立的C++文件(math.cpp),如下所示:

int add(int x, int y) {
  return x + y;
}
Run Code Online (Sandbox Code Playgroud)

我如何将其编译为WebAssembly(math.wasm)?

注意:我正在使用Clang工具链.

kaz*_*ase 27

我发现这个要点非常有帮助.

基本上,这是步骤:

  1. (构建llvm和clang 5.0.0或以上版本-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly)
  2. 使用clang将.cpp源编译为llvm bitcode:

    clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc

  3. 将bitcode编译为s-assembly:

    llc -asm-verbose=false -o math.s math.bc

  4. 使用binaryen的s2wasm工具来创建一个.wast文件

    s2wasm math.s > math.wast

  5. 使用WABT的wast2wasm工具将文本.wast文件转换为二进制.wasm:

    wast2wasm -o math.wasm math.wast

有些步骤感觉多余,但我还没有找到一个允许快捷方式的工具.(如果有可能直接编译成.wasm,或者如果s2wasm实际上创建了二进制.wasm文件,就像名字所示那样会很好.)无论如何,一旦你得到了工具链,它就会相对无痛.但请注意,还没有用于Web程序集的C或C++标准库.

或者,如果您需要.wasm文件只是为了尝试一些东西,您可以在没有所有工具链麻烦的情况下离开.浏览到https://mbebenita.github.io/WasmExplorer/,粘贴您的C/C++代码,然后下载已编译的.wasm文件.


谢谢@noontz和@ LB--指出这一点

实际上,因为要点中的注释建议你可以跳过binaryen并直接从Clang/LLVM编译.我目前正在使用C++的以下命令行:

clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm \ 
        --optimize=3 --output test.wasm
Run Code Online (Sandbox Code Playgroud)

  • 实际上,因为要点中的注释建议你可以跳过binaryen并直接从Clang/LLVM编译.我目前正在使用以下C++命令行:`clang ++ test.cpp -ObjC++ --compile --target = wasm32-unknown-unknown-wasm --optimize = 3 --output test.wasm` (8认同)

Cli*_*int 8

Emscripten附带了将C++文件编译为wasm所需的一切.Emscripten还有一个SDK,可以在安装所有必需的工具时简化生活.

但是,默认情况下,Emscripten会将一些框架代码添加到您的wasm文件中,并生成一些html和javascript.

可以使用Emscripten创建一个不包含任何框架代码,javascript或html的最小wasm文件.-s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1在编译时使用选项emccem++将为您提供最小的wasm文件.

以下命令将使用您的示例和Emscripten导出最小的wasm文件:

em++ math.cpp -o math.wasm -Oz -s SIDE_MODULE=1 -s WASM=1 -s "EXPORTED_FUNCTIONS=['_add']" -s ONLY_MY_CODE=1


Pet*_*ter 8

截至 2019 年,Clang (8) 支持开箱即用的 WebAssembly。这是一个存储库,其中包含编译、链接和运行简单 .wasm 文件所需的所有内容。

https://github.com/PetterS/clang-wasm