如何将 C 文件编译为 WebAssembly?

新手上路,请多包涵

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

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

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

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

原文由 sdgfsdh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 574
1 个回答

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

基本上,这些是步骤:

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

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

  1. 将位码编译为 s-assembly:

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

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

s2wasm math.s > math.wast

  1. 使用 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

原文由 MB-F 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏