45

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

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

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

注意:我使用的是 Clang 工具链。

4

6 回答 6

35

我发现这个要点很有帮助。

基本上,这是步骤:

  1. (构建 llvm 和 clang 5.0.0 或更高版本-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly
  2. 使用 clang 将 .cpp 源编译为 llvm 位代码:

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

  3. 将位码编译为 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

有些步骤感觉多余,但我还没有找到允许快捷方式的工具。(如果 llc 可以直接编译为 .wasm,或者如果 s2wasm 顾名思义实际上创建了二进制 .wasm 文件,那就太好了。)无论如何,一旦你运行了工具链,它就相对轻松了。但是请注意,目前还没有用于 Web 汇编的 C 或 C++ 标准库。

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


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

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

clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm \ 
        --optimize=3 --output test.wasm
于 2017-07-17T14:11:47.187 回答
12

Emscripten提供了将 C++ 文件编译为 wasm 所需的一切。Emscripten 还有一个SDK,可以让您轻松安装所有必要的工具。

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

可以使用 Emscripten 创建一个不包含任何框架代码、javascript 或 html 的最小 wasm 文件。-s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1在编译时使用选项emccorem++会给你一个最小的 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

于 2018-04-06T18:28:54.760 回答
8

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

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

于 2019-03-05T22:28:19.807 回答
4

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

于 2017-07-18T07:01:19.307 回答
3

根据此线程中的答案,我创建了一个小指南

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

由于 c++ 的名称重整,我发现 C 入门更容易。

于 2019-01-18T10:21:10.127 回答
2

这个答案有点晚了,但是网上有漂亮的工具可以编译你的脚本。

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

并且根据您将如何使用它,您可以在不同的语言之间进行选择,例如 x86、code Buffer。您还可以分享您的代码,当您与其他伙伴一起工作时,我觉得这些功能很酷:https ://wasdk.github.io/WasmFiddle/? gus9d :)

于 2017-08-01T14:30:15.423 回答