Emscripten 指南:概念与使用

什么是 Emscripten?

Emscripten 是一个开源的编译器工具链,用于将 C/C++ 代码编译成高效的 WebAssembly(Wasm)和 JavaScript。它基于 LLVM 编译器架构,允许开发者:

  • ✅ 将现有的 C/C++ 应用移植到 Web 环境
  • ✅ 在浏览器中运行高性能计算模块
  • ✅ 复用成熟的 C/C++ 库到 Web 项目

核心功能

  1. 代码转换
    将 C/C++ 源码 → WebAssembly(.wasm) + JavaScript 胶水代码
  2. 兼容性支持
    模拟文件系统(MEMFS)、OpenGL → WebGL 转换
  3. 优化能力
    通过 Closure Compiler 压缩代码,优化执行效率

安装 Emscripten

前置要求

  • Python 3.7+
  • Git
  • CMake(推荐)
  • 系统编译工具链(如 gcc、clang)

安装步骤

# 克隆仓库
git clone https://github.com/emscripten-core/emsdk.git
# 进入目录
cd emsdk
# 安装最新版工具链
./emsdk install latest
# 激活环境变量
./emsdk activate latest
source ./emsdk_env.sh
# 验证安装
emcc --version

基础使用教程

示例:编译 C 程序到 WebAssembly

  1. 创建 C 文件 (hello.c)
#include <stdio.h>
int main() {printf("Hello, Emscripten!\n");return 0;
}
  1. 使用 emcc 编译
emcc hello.c -o hello.html
  1. 生成文件
  • hello.wasm:WebAssembly 二进制
  • hello.js:JavaScript 加载器
  • hello.html:可直接运行的网页

运行结果

启动本地服务器查看:

python3 -m http.server 8000

访问 http://localhost:8000/hello.html

进阶用法

编译选项说明

参数作用
-O3最高级别优化
-s WASM=1强制生成 Wasm(默认启用)
-s SINGLE_FILE=1将 Wasm 内联为 Base64 编码
--preload-file打包资源文件

调用 JavaScript 函数

在 C 代码中使用 EM_JS 宏:

#include <emscripten.h>
EM_JS(void, js_alert, (const char* msg), {alert(UTF8ToString(msg));
});
int main() {js_alert("Called from C!");return 0;
}

集成到 Web 项目

<!-- 在 HTML 中加载 -->
<script src="hello.js"></script>
<script>Module.onRuntimeInitialized = () => {// 调用 C 中的 main() 函数Module._main();};
</script>

常见问题解决

  1. 文件系统访问
    使用 Emscripten 的虚拟文件系统:
    FILE *file = fopen("/data.txt", "r");
    
    通过 --preload-file data.txt 打包文件
  2. 内存泄漏检测
    编译时添加:
    emcc -gsource-map -s INITIAL_MEMORY=64MB ...
    
  3. 调试方法
    • 浏览器开发者工具 → Wasm 调试
    • 编译时添加 -g4 保留调试符号
    • 使用 emrun --browser debug 启动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93103.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93103.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93103.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用镜像网站 打开克隆 GitHub 网站仓库内容 git clone https://github.com/

GitHub 网站有时因 DNS 解析问题或网络限制&#xff0c;国内访问可能会受限。使用镜像网站打开网站 使用镜像网站&#xff1a;GitHub 有一些镜像网站&#xff0c;可替代官网访问&#xff0c;如https://hub.fastgit.org、https://gitclone.com、https://github.com.cnpmjs.org等…

Linux随记(二十二)

一、redhat6.5 从openssh5.3 升级到openssh10 - 报错处理【升级后账号密码一直错误 和 sshd dead but subsys locked】 虚拟机测试情况 - 正常&#xff1a;情况一、 升级后账号密码一直错误 情况二、 执行service sshd status出现 sshd dead but subsys locked

机器学习之TF-IDF文本关键词提取

目录 一、什么是 TF-IDF&#xff1f; 1.语料库概念理解 二、TF-IDF 的计算公式 1. 词频&#xff08;TF&#xff09; 2. 逆文档频率&#xff08;IDF&#xff09; 3. TF-IDF 值 三、关键词提取之中文分词的实现 四、TF-IDF简单案例实现 &#xff08;1&#xff09;数据集…

Flutter屏幕和字体适配(ScreenUtil)

一、简介 flutter_screenutil 是一个 Flutter 插件&#xff0c;专门用于处理屏幕适配问题。它简化了不同设备间尺寸差异的处理&#xff0c;确保你的应用在各种屏幕上都能保持良好的显示效果。开发者可以通过简单的调用来设置基于设计图尺寸的控件宽高和字体大小。 项目地址&a…

mimiconda+vscode

安装miniconda实现python包管理&#xff0c;并通过vscode进行编写python代码 miniconda简单介绍 Miniconda 是 Anaconda 公司的一个轻量级 Python 发行版本&#xff0c;它包含了最基本的包管理器 conda 和 Python 环境&#xff0c;只带最核心的组件&#xff0c;没有额外的大量科…

Windows文件时间修改指南:从手动到自动化

修改文件的时间属性可以满足多种需求。比如&#xff0c;它可以帮助整理文件&#xff0c;使得文件按照特定的时间顺序排列&#xff0c;有助于更好地管理资料。它的体积真小&#xff0c;才300多KB。能用来调整文件的创建时间、最后访问和修改时间。文件时间属性修改_NewFileTime.…

能刷java题的网站

以下是一些适合刷Java题的优质网站&#xff0c;涵盖从基础到进阶、算法面试及实战项目等多种需求&#xff1a; ​一、综合编程练习平台​ ​LeetCode​&#xff08;leetcode.com&#xff09; ​特点​&#xff1a;全球最知名的算法题库&#xff0c;含海量Java题目&#xff0c;分…

掘金数据富矿,永洪科技为山东黄金定制“数智掘金”实战营

在黄金开采的轰鸣声中&#xff0c;另一场静水深流的“掘金行动”正悄然展开。山东黄金集团&#xff0c;这个行业的巨头&#xff0c;在深挖地层宝藏的同时&#xff0c;也敏锐捕捉到数据洪流中蕴藏的价值富矿。然而&#xff0c;当海量业务数据汇聚&#xff0c;如何从中精准提炼决…

【论文阅读】BEVFormer论文解析及Temporal Self-Attention、Spatial Cross-Attention注意力机制详解及代码示例

BEVFormer: Learning Bird’s-Eye-ViewRepresentation from Multi-Camera Images via Spatiotemporal Transformers|Temporal Self-Attention、Spatial Cross-Attention注意力机制详解 BEVFormer&#xff08;Bird’s-Eye-View Former&#xff09;是一种先进的计算机视觉模型&am…

在 Ubuntu 中docker容器化操作来使用新建的 glibc-2.32

在 Ubuntu 中使用容器化操作来使用新建的 glibc-2.32,可以通过创建自定义 Docker 镜像来实现。以下是完整的解决方案: 方案 1:创建包含 glibc-2.32 的 Docker 镜像 1. 创建 Dockerfile dockerfile # 使用 Ubuntu 基础镜像 FROM ubuntu:20.04# 安装编译依赖 RUN apt-get …

GOOUUU ESP32-S3-CAM 果云科技开发板开发指南(二)(超详细!)Vscode+espidf 摄像头拍摄视频实时传输到LCD,文末附源码

书接上回&#xff0c;上一篇blog是使用esp32s3通过ov2640摄像头拍摄到一帧照片&#xff0c;并把它保存到了SD卡中&#xff0c;这第二篇就通过LCD将拍摄到的图片显示到LCD上&#xff0c;本次分享硬件使用的 ESP32-S3-CAM 果云科技开发板&#xff0c;并且使用了配套的LCD扩展板&a…

攻防世界-ics-05(远程文件执行)

一.审题大致浏览一下网页&#xff0c;发现就这边会有东西。看一下源码会不会有东西或者稍微点击一下这个页面的内容看会不会出现东西。点击了一下这个云平台设备维护中心发现url变了&#xff0c;是get的方法传page参数二.尝试漏洞类型自己这边试了sql注入发现不是&#xff0c;试…

Dell PowerEdge: Servers by generation (按代系划分的服务器)

Dell PowerEdge: Servers by generation {按代系划分的服务器}1. Table of 17th, 16th, 15th, and 14th Generation PowerEdge servers2. List of all PowerEdge server models including Type, CPU vendor, Generation, and Remote ManagementReferencesPowerEdge: Servers by…

Rust学习笔记(二)|变量、函数与控制流

本篇文章包含的内容1 变量与常量2 类型2.1 标量类型2.2 复合类型3 函数4 控制流4.1 分支4.2 循环1 变量与常量 在Rust中&#xff0c;使用let关键字声明一个变量&#xff0c;变量默认是不可变的。如果要声明可变变量&#xff0c;需要使用mut关键字将其声明为可变变量。 let x …

【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达 前情提要 【渲染流水线】主线索引-从数据到图像以UnityURP为例-CSDN博客 图元装配负责将离散顶点组装成完整几何图元&#xff08;如点、线、三角形、三角形条带&#xff09; &#xff08;对渲染的探索是个持续不断完善的过程&#x…

jvm有哪些垃圾回收器,实际中如何选择?

7.G1收集器一款面向服务端应用的垃圾收集器。 特点如下&#xff1a; 并行与并发&#xff1a;G1能充分利用多CPU、多核环境下的硬 件优势&#xff0c;使用多个CPU来缩短Stop-The-World停顿时间。部分收集器原本需要停顿Java线程来执行GC动作&#xff0c;G1收 集器仍然可以通过并…

多语言与隐形攻击:LLM安全防线为何被频频突破?

你是否曾以为&#xff0c;只要加装了“防火墙”&#xff0c;大型语言模型&#xff08;LLM&#xff09;就能高枕无忧&#xff1f;Trendoyl 的实际测试却让我大吃一惊&#xff1a;即便部署了 Meta 的 Llama Guard&#xff0c;攻击者还是能轻松用多语种、字符混淆&#xff0c;甚至…

分布式光伏气象站:为光伏电站的 “气象感知眼”

分布式光伏气象站&#xff1a;为光伏电站的 “气象感知眼”柏峰 【BF-GFQX】在全球能源转型的浪潮中&#xff0c;分布式光伏发电凭借其就近消纳、清洁高效的优势&#xff0c;成为能源结构优化的重要力量。而分布式光伏气象站&#xff0c;作为光伏电站的 “智慧感知眼”&#xf…

TCP与UDP:如何选择最佳传输协议

应用场景选择如果需要可靠传输&#xff0c;首选 TCP如果需要传输的数据包很大&#xff0c;也首选 TCP绝大部分的场景&#xff0c;都可以优先考虑 TCPUDP 相比于 TCP&#xff0c;最大的优点在于传输效率有些情况&#xff0c;既需要可靠性又需要性能&#xff0c;这个时候时候就需…

《Leetcode》-面试题-hot100-栈

题目列表 20. 有效的括号 简单难度 leetcode链接 155. 最小栈 中等难度 leetcode链接 394. 字符串解码 中等难度 leetcode链接 739. 每日温度 中等难度 leetcode链接 84. 柱状图中最大的矩形 困难难度 leetcode链接 题目 &#xff08;1&#xff09;有效的括号 题目 给…