Emscripten的常用工具介绍

2026年1月29日 34点热度 2人点赞 0条评论

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

StackSnow

追风赶月莫停留,平芜尽处是春山。

文章评论