API 限制

浏览器环境和 JavaScript 与 C 和 C++ 通常运行的原生环境不同。这些差异对如何调用和使用原生 API 施加了一些限制。本节列出了一些比较明显的限制。

网络

Emscripten 支持 libc 网络函数,但您必须将自己限制为异步(非阻塞)操作。这是因为底层的 JavaScript 网络函数是异步的。

文件系统

Emscripten 支持 libc 文件系统函数,C/C++ 代码可以用通常的方式编写。

浏览器环境 中运行的代码是沙盒化的,并且不能直接访问本地文件系统。相反,Emscripten 创建一个虚拟文件系统,该文件系统可以预先加载数据或链接到 URL 以进行延迟加载。这会影响何时可以调用同步文件系统函数以及如何编译项目。有关更多信息,请参见 文件系统概述

应用程序主循环

浏览器事件模型使用 协作式多任务 — 每个事件都有一个“回合”来运行,然后必须将控制权返回到浏览器事件循环,以便处理其他事件。HTML 页面挂起的常见原因是 JavaScript 没有完成并返回控制权到浏览器。

这可能会影响使用无限主循环的应用程序的编写方式。有关更多信息,请参见 Emscripten 运行时环境

其他 API

对其他 可移植 C/C++ 代码的支持是 相当全面的