2017-07-17 118 views
9

假设我有一个简单,独立的C++文件(math.cpp)是这样的:如何将C++文件编译为WebAssembly?

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

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

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

+1

告诉我们您是否可以设法做到这一点,因为涉及很多步骤,而且都需要大量的大量下载和配置。网上大会感觉真的很令人兴奋,但我不能说我很激动,当我把所有的时间花在尝试,甚至没有前进一点。我不再为此感到兴奋。 – jokoon

回答

8

我发现this gist非常有帮助。

基本上,这是步骤:

  1. (建立LLVM和铛5.0.0或以上-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly
  2. 编译的.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/,paste in your C/C++ code,并下载编译后的.wasm文件。

+1

事实上,正如在要点中的意见建议你可以跳过二进制,直接从Clang/LLVM编译为wasm。我目前在C++中使用以下命令行:'clang ++ test.cpp -ObjC++ --compile --target = wasm32-unknown-unknown-wasm --optimize = 3 --output test.wasm' – noontz

+0

@noontz呃,不错..看起来像是值得阅读要点评论;)如果有人可以独立确认这个作品(或者我已经设法尝试),我会将其编辑为答案。 – kazemakase

1

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

+1

这是一个很好的建议 - 使用emscripten构建起来要容易得多 - 但这个问题根本就没有。 Emscripten将比以前的步骤创建更大规模的文件 –

0

有点迟了这个答案,但有一些漂亮的工具在线编译你的脚本。

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

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