Emscripten是一个将C/C++ 代码编译为WebAssembly(Wasm) 的开源工具链,它允许开发者将高性能的原生代码带到Web平台。该工具链包含多个命令行工具,包括emsdk、emcc、em++、emcmake、emmake 等常用指令。
emsdk
emsdk是管理Emscripten SDK版本的命令行管理工具,支持多版本切换、自动更新等
# 安装最新版
emsdk install latest
# 激活当前版本
emsdk activate latest
# 查看已安装版本
emsdk list
# 更新emsdk自身
emsdk update
emcc和em++
Emscripten作为LLVM到WebAssembly的编译器,其C语言编译器前端为emcc,负责将C语言代码编译为WebAssembly;其C++语言编译器前端为em++,负责将C++语言代码编译为WebAssembly,支持C++11及以上标准,本质上是emcc的C++模式封装,支持C++标准库和STL。作为Clang的封装,不仅继承了GCC/Clang的大部分参数,同时又添加了WebAssembly特有的编译选项。
# 将C代码编译为HTML
emcc hello_world.c -o hello.html
# 将C代码编译为独立WASM模块
emcc hello_world.c -o hello.wasm -s STANDALONE_WASM=1
# 编译C++代码
em++ hello_world.cpp -o hello_cpp.html
# 使用C++17标准
em++ -std=c++17 hello_cpp17.cpp -o hello_cpp17.html
常用编译参数
| 参数名称 | 功能描述 | 适用场景 |
|---|---|---|
| -O0 / -O3 / -Os / -Oz | 控制优化级别 | 调试 / 最大优化 / 尺寸优先 / 极致尺寸优化 |
| -g | 生成调试信息 | 使用Chrome DevTools的WebAssembly调试支持 |
| -s OPTION=VALUE | 设置编译选项 | 例如:-s EXPORTED=["_main"] |
| --pre-js / --post-js | 添加前置/后置JS代码 | 扩展WebAssembly功能 |
em++与emcc的主要区别
em++ 默认启用C++标准库支持,自动链接C++运行时库(libc++),支持C++异常处理和RTTI,并且通过embind可以将C++函数和类暴露给JavaScript。
#include <emscripten/bind.h>
using namespace emscripten;
int add(int a, int b) { return a + b; }
EMSCRIPTEN_BINDINGS(my_module) {
function("add", &add);
}
// bash 编译指令
em++ --bind hello_bind.cpp -o bind_example.html
emcmake和emmake
通常我们的C++工程使用CMake进行构建和管理,emcmake 是Emscripten提供的一个包装器,能够自动设置CMake使用Emscripten的工具链,调用cmake命令进行目标构建。
# 使用emcmake调用cmake命令
emcmake.py cmake /d/path/to/project_dir
emmake 是Emscripten提供的另一个包装器,确保使用Emscripten的工具链进行编译。
# 使用emmake调用make命令
emmake.py make

文章评论