2017-07-17 156 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 :)