一、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/n/189698.html