假設我有一個簡單,獨立的C++文件(math.cpp
)是這樣的:如何將C++文件編譯爲WebAssembly?
int add(int x, int y) {
return x + y;
}
我將如何把它編譯成WebAssembly(math.wasm
)?
注意:我正在使用Clang工具鏈。
假設我有一個簡單,獨立的C++文件(math.cpp
)是這樣的:如何將C++文件編譯爲WebAssembly?
int add(int x, int y) {
return x + y;
}
我將如何把它編譯成WebAssembly(math.wasm
)?
注意:我正在使用Clang工具鏈。
我發現this gist非常有幫助。
基本上,這是步驟:
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly
)編譯的.cpp索裏到LLVM位碼與鐺:
clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc
將位編碼編譯爲s-assembly:
llc -asm-verbose=false -o math.s math.bc
使用binaryen的s2wasm工具來創建一個.wast文件
s2wasm math.s > math.wast
使用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文件。
事實上,正如在要點中的意見建議你可以跳過二進制,直接從Clang/LLVM編譯爲wasm。我目前在C++中使用以下命令行:'clang ++ test.cpp -ObjC++ --compile --target = wasm32-unknown-unknown-wasm --optimize = 3 --output test.wasm' – noontz
@noontz呃,不錯..看起來像是值得閱讀要點評論;)如果有人可以獨立確認這個作品(或者我已經設法嘗試),我會將其編輯爲答案。 – kazemakase
目前最簡單的編譯C和C++的方法是使用emscripten。你提到的組件都是組件,但emscripten是一個完整的工具鏈,支持建立端到端,幷包括你需要的所有部分,包括libc/libC++和其他各種有用的庫。它支持針對asm.js和wasm。
這是一個很好的建議 - 使用emscripten構建起來要容易得多 - 但這個問題根本就沒有。 Emscripten將比以前的步驟創建更大規模的文件 –
有點遲了這個答案,但有一些漂亮的工具在線編譯你的腳本。
舉例來說,我正在使用這一個。那一個給你minimim編譯選項(C,C++,std99 ...),但有足夠的:https://wasdk.github.io/WasmFiddle/
而根據你將如何使用它,你可以選擇不同的語言,如x86,代碼緩衝區。您也可以分享您的代碼,當您與其他好友一起工作時,我覺得它很酷:https://wasdk.github.io/WasmFiddle/?gus9d :)
告訴我們您是否可以設法做到這一點,因爲涉及很多步驟,而且都需要大量的大量下載和配置。網上大會感覺真的很令人興奮,但我不能說我很激動,當我把所有的時間花在嘗試,甚至沒有前進一點。我不再爲此感到興奮。 – jokoon