一、emsdk簡介
emsdk是一個基於Python的全平台(Windows、Mac、Linux)的開發工具,主要用於管理和使用emscripten編譯器。emsdk的主要功能包括:安裝、卸載emscripten以及相關工具鏈,切換不同版本的emscripten編譯器,管理運行時模塊(即.s和.js文件),支持WebAssembly生成和優化等。
二、emsdk的安裝與卸載
emsdk的安裝非常簡單,只需以下命令即可:
git clone https://github.com/emscripten-core/emsdk.git cd emsdk ./emsdk install latest ./emsdk activate latest
以上命令會在當前目錄下以emsdk為名,將最新版本的emscripten安裝到本地。如果需要卸載emsdk,則可以使用以下命令:
./emsdk uninstall latest rm ~/.emscripten rm -rf ~/.emscripten_cache
三、emsdk的使用
1. 切換emscripten版本
使用emsdk安裝emscripten後,可隨時切換不同版本的編譯器。通過以下命令,列舉所有已經安裝的版本:
./emsdk list
然後可使用以下命令,使當前終端會話環境下的emscripten版本號為1.38.13:
./emsdk activate 1.38.13
此時,可通過以下命令查看當前環境下emscripten的版本號:
em++ --version
2. 編譯C/C++代碼為WebAssembly
使用emscripten編譯C/C++代碼為WebAssembly,需要使用emcc命令,例如:
emcc hello.c -o hello.html
這會將hello.c代碼編譯為hello.html文件,其中包含了一個JavaScript腳本文件,該腳本文件可將WebAssembly模塊動態鏈接到當前文檔中。
3. 程序集級優化
使用以下命令,可以通過二進位文件或者參數,將優化級別設置為不同的級別:
O2: 在對時間和大小進行平衡的情況下,打開所有通用代碼優化標誌,以產生最佳代碼質量和大小。 Os:確保生成大量代碼,提供了一個啟發式的代碼大小優化級別,不犧牲時間太多。 Oz:與Os相同,但使用代碼大小優化,可能會犧牲時間(如,將低效的數學函數替換為approximants)。 Ofast:允許所有未定義的行為,打開所有策略優化標誌。
4. 使用自定義的JavaScript綁定
通過編寫名為「XXX_binding.cpp」(XXX可以是任意字元串)的文件,可以將C/C++代碼與JavaScript進行綁定。例如,以下是生成了一個名為「my_module.js」的模塊,它暴露了一個名為「my_add」的函數:
extern "C" { EMSCRIPTEN_KEEPALIVE int my_add(int a, int b) { return a + b; } }
5. 使用Node.js API
通過引入emscripten模塊,可以使用JavaScript (.js) API。例如,以下代碼可以在Node.js模塊中通過JavaScript調用C/C++函數:
const emscripten = require('./my_module.js'); const result = emscripten.ccall( 'my_add', // function name 'number', // return type ['number', 'number'], // argument types [1, 2] // arguments ); console.log(result); // 3
四、emsdk的示例
以下是一個使用emsdk編譯生成WebAssembly的簡單示例項目:
#include int main() { printf("Now switch to the main thread and wait\n"); emscripten_sleep(1000); // Sleep 1 second printf("And now exit\n"); return 0; }
使用以下命令,將該C文件編譯為WebAssembly模塊:
emcc my_program.c -o my_program.html
這將生成一個my_program.html文件,您可以將其拖放到瀏覽器中以運行它。該HTML文件應該是基於JavaScript腳本的,並將WebAssembly模塊動態鏈接到文檔中,然後調用該模塊。當Text解釋器運行腳本時,它將調用 emscripten_run_script(「<script>var Module = …</script>」)函數來動態載入模塊並運行它。
結語
以上是emsdk工具的基本用法及示例,emsdk工具非常強大,可以用於WebAssembly編譯以及與JavaScript的交互,值得每個程序員的深入了解與使用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/189698.html