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

时间:2017-07-17 13:50:43

标签: c++ webassembly

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

int add(int x, int y) {
  return x + y;
}

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

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

6 个答案:

答案 0 :(得分:25)

我发现this gist非常有用。

基本上,这是以下步骤:

  1. (使用-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly构建llvm和clang 5.0.0或更高版本)
  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

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

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

    感谢@noontz和@ LB--指出

      

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

    clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm \ 
            --optimize=3 --output test.wasm
    

答案 1 :(得分:6)

Emscripten附带了将C ++文件编译为wasm所需的一切。 Emscripten还有一个SDK,在安装所有必要工具时可以轻松实现。

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

可以使用Emscripten创建一个最小的wasm文件,该文件不包含任何框架代码,javascript或html。在使用-s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1emcc进行编译时使用选项em++将为您提供最小的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

答案 2 :(得分:3)

从2019年开始,Clang(8)开箱即用地支持webassembly。这是一个存储库,其中包含编译,链接和运行简单的.wasm文件所需的一切。

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

答案 3 :(得分:2)

目前编译C和C ++的最简单方法是使用{{3}}。您提到的组件都是组件,但emscripten是一个完整的工具链,支持端到端构建,包括您需要的所有部分,包括libc / libc ++和各种其他有用的库。它支持同时定位asm.js和wasm。

答案 4 :(得分:1)

对于这个答案来说有点晚了,但是有很多漂亮的工具可以在线编译你的脚本。

例如,我正在使用这个。那个给你最小的编译选项(C,C ++,std99 ......),但有足够的:https://wasdk.github.io/WasmFiddle/

根据您将如何使用它,您可以选择不同的语言,如x86,代码缓冲区。你也可以分享你的代码,当你和其他伙伴一起工作时我觉得很酷的一些功能:https://wasdk.github.io/WasmFiddle/?gus9d :)

答案 5 :(得分:1)

根据该主题的答案,我创建了一个guide

对我来说,最简单的方法是在我的机器上编译emscripten(该网站也是一个很好的起点!),将代码编译为wasm,生成适当的绑定,然后将所有这些隐藏在包装中JS方面,我得到了一个不错的界面。

由于c ++的名称修改,我发现开始使用C会更容易。