面向 WebAssembly 的 C++ 编译与优化基础库,附带 wasm-opt 等命令行工具和 binaryen.js。
emscripten-core/emscripten
将 C 和 C++ 代码编译为 WebAssembly,使其可在浏览器、Node.js 等环境运行的编译工具链。
- Star
- 27,734
- Fork
- 3,572
- 未关闭 Issue
- 2,527
- 最近提交
- 4小时前
这是什么?
Emscripten 基于 LLVM 和 Binaryen,将 C 和 C++ 编译为 WebAssembly。产物可运行在网页、Node.js 以及独立的 Wasm 运行时中。使用方式与 gcc、clang 类似,执行 emcc 即可生成 WebAssembly 模块及用于加载它的 JavaScript 文件,或一个示例 HTML 页面。
项目提供了 OpenGL、SDL2 等常见可移植 API 的 Web 实现,便于把已有的原生图形应用移植到浏览器中。Unity 游戏引擎和 Google Earth 等大型项目都是通过这类方式移植的。
项目主要围绕通过 Clang 编译 C 和 C++,也可与其他基于 LLVM 的编译器集成,例如 Rust 的 wasm32-unknown-emscripten 目标。
核心功能
- 01通过 LLVM 和 Binaryen 将 C 和 C++ 编译为 WebAssembly。
- 02产物可在浏览器、Node.js、Deno、Bun 及独立 Wasm 运行时中运行。
- 03提供 OpenGL、SDL2 等 API 的 Web 实现。
- 04使用 emcc 命令,调用方式与 gcc、clang 相近。
- 05可生成 HTML 页面或纯 JavaScript 加载文件。
适用场景
- 将现有的 C 或 C++ 桌面应用或游戏移植到网页中运行。
- 在 Node.js 项目中调用原生 C 或 C++ 库。
- 将 C 代码编译为 WebAssembly 模块,供其他 Wasm 运行时使用。
快速上手
- 1
从下载页面安装 Emscripten SDK(emsdk)
- 2
将 hello.c 编译为 JavaScript 文件
emcc hello.c -o hello.js - 3
用 Node.js 运行生成的 JavaScript 文件
node hello.js
使用前须知
- 安装需要从下载页面获取 emsdk 工具链,而不是一条包管理器命令即可完成。
标签
常见问题
- emscripten 是什么?
- 将 C 和 C++ 代码编译为 WebAssembly,使其可在浏览器、Node.js 等环境运行的编译工具链。 Emscripten 基于 LLVM 和 Binaryen,将 C 和 C++ 编译为 WebAssembly。产物可运行在网页、Node.js 以及独立的 Wasm 运行时中。使用方式与 gcc、clang 类似,执行 emcc 即可生成 WebAssembly 模块及用于加载它的 JavaScript 文件,或一个示例 HTML 页面。
- emscripten 可以免费使用吗?用的什么许可证?
- emscripten 以 Other 许可证开源。用于商业产品前,请先确认许可证条款。
- emscripten 还在维护吗?
- 活跃维护中。emscripten 最近一次提交是在 2026年10月21日。
- emscripten 适合用来做什么?
- 将现有的 C 或 C++ 桌面应用或游戏移植到网页中运行。 在 Node.js 项目中调用原生 C 或 C++ 库。 将 C 代码编译为 WebAssembly 模块,供其他 Wasm 运行时使用。
- emscripten 怎么安装和运行?
- 从下载页面安装 Emscripten SDK(emsdk) 将 hello.c 编译为 JavaScript 文件: emcc hello.c -o hello.js 用 Node.js 运行生成的 JavaScript 文件: node hello.js
- 在哪里获取 emscripten?
- 源代码和安装说明在 GitHub 上:https://github.com/emscripten-core/emscripten
概要由 AI 根据项目 README 生成;GitHub 数据每日更新。
相关项目
基于 WebAssembly 和 JavaScript 移植的 FFmpeg,可在浏览器中录制、转码和推流音视频。
模块化的编译器与工具链技术集合,包含 LLVM 核心、Clang 前端、libc++ 标准库和 LLD 链接器。
一种类 TypeScript 的语言及编译器,可将带类型的 TypeScript 变体编译为 WebAssembly 模块。
基于 LLVM 的 Go 编译器,面向微控制器、WebAssembly 和命令行工具。
一个实验性的编译器,可将 TypeScript/JavaScript 编译为原生可执行文件或 WebAssembly,运行时无需 Node.js。