当前位置: 首页 > news >正文

C语言转WebAssembly的全流程,及Web端调用测试

第一步:安装环境

参考网址:https://emscripten.org/docs/getting_started/downloads.html

具体过程:

  1. 克隆代码:git clone https://github.com/emscripten-core/emsdk.git
  2. 进入代码目录:cd emsdk
  3. 获取最新远端代码:git pull
  4. 下载最新sdk:./emsdk install latest
  5. 激活:./emsdk activate latest
  6. 激活路径和使环境变量生效:source ./emsdk_env.sh

说明:若在Windows系统中

  • 请使用emsdk.bat代替上列的./emsdk,使用emsdk_env.bat代替./emsdk_env.sh,即所执行的命令分别为(第1、2、3步相同):
    • emsdk.bat install latest
    • emsdk.bat activate latest
    • source ./emsdk_env.sh
    • source emsdk_env.bat
  • 在所有系统中,安装工具的步骤同上。

第二步:编写C语言代码

#include <stdio.h>
#include <emscripten/emscripten.h>int main() {printf("Hello World\n");return 0;
}#ifdef __cplusplus
#define EXTERN extern "C"
#else
#define EXTERN
#endifEXTERN EMSCRIPTEN_KEEPALIVE void myFunction(int argc, char ** argv) {printf("MyFunction Called\n");
}EXTERN EMSCRIPTEN_KEEPALIVE void myMaxFunc(int argc, char ** argv) {printf("11111 -----  myMaxFunc Called\n");
}

说明:

  • 我对C语言不太会,参考官方文档编写了上述代码,具体的内容后续再做深究。
  • 重要的是后面两段;
EXTERN EMSCRIPTEN_KEEPALIVE void myFunction(int argc, char ** argv) {printf("MyFunction Called\n");
}EXTERN EMSCRIPTEN_KEEPALIVE void myMaxFunc(int argc, char ** argv) {printf("11111 -----  myMaxFunc Called\n");
}

后面在web端调用的时候,就是调用的myFunctionmyMaxFunc方法。

第三步:进行代码编译

C语言的代码编译命令:

emcc -o web_assembly_test.html hello3.c --shell-file html_template/shell_minimal.html -s NO_EXIT_RUNTIME=1 -s "EXPORTED_RUNTIME_METHODS=['ccall']"

可能看不懂,但是你记下就好了。

说明:

  • hello3.c就是我们编写的C语言的文件
  • web_assembly_test.html是编译后输出的文件。

在执行完上述命令行语句后,会生成三个文件,分别是:

  • web_assembly_test.html 用于进行测试的html文件
  • web_assembly_test.js.wasm文件进行调用的一系列js文件,不要动就是了。改该改的地方就行
  • web_assembly_test.wasm 打包后的.wasm文件

第四步:修改web_assembly_test.js文件

还记得我们在.c文件中的那两个特殊的方法吗:myFunctionmyMaxFunc

打开web_assembly_test.js文件,找到var wasmExports = createWasm();代码的位置。添加以下代码:

var wasmExports = createWasm();
var _myFunction = Module['_myFunction'] = createExportWrapper('myFunction');
var _myMaxFunc = Module['_myMaxFunc'] = createExportWrapper('myMaxFunc');

这一段可能有很多的方法,你只需要将你自己需要的写进去就行,不用改其他的。

第五步:JavaScript调用

在html文件中添加代码,并执行测试。

  1. 添加一个button按钮
<button id="mybutton">测试按钮</button>
  1. 调用方法
document.getElementById("mybutton").addEventListener("click", () => {// alert("check console");const result = Module.ccall("myFunction", // name of C functionnull, // return typenull, // argument typesnull, // arguments);const result2 = Module.ccall("myMaxFunc", // name of C functionNumber, // return type[Number, Number], // argument types[10,11], // arguments);console.log('result = ', result2)
});

可以看到,我们将两个方法都调用了。下面我们看控制台的输出(因为我们的方法里只写了输出,没有写其它的。因为我不会!!!o(╥﹏╥)o)

在这里插入图片描述

最后

WebAssembly对于调用C/C++库都是挺有用的,它可以提高效率。本篇将C语言进行汇编的流程梳理通了,但是要写一些具体的方法不会。下面就是调用一些大的C语言库了,后续测评和使用技巧不断输出。

相关文章:

C语言转WebAssembly的全流程,及Web端调用测试

第一步&#xff1a;安装环境 参考网址&#xff1a;https://emscripten.org/docs/getting_started/downloads.html 具体过程&#xff1a; 克隆代码&#xff1a;git clone https://github.com/emscripten-core/emsdk.git进入代码目录&#xff1a;cd emsdk获取最新远端代码&…...

前端--基础 目录文件夹和根目录 VScode打开目录文件夹

目录 目录文件夹和根目录 &#xff1a; 目录文件夹 &#xff1a; 根目录 &#xff1a; VScode 打开目录文件夹 &#xff1a; VScode 打开文件夹 &#xff1a; 拖拽目录文件夹 &#xff1a; 目录文件夹和根目录 &#xff1a; 我们都清楚&#xff0c;在实际的工作中会…...

传感器原理与应用复习--超声波、微波、红外及热电偶传感器

文章目录 上一篇超声波传感器微波传感器红外传感器热电偶传感器下一篇 上一篇 传感器原理与应用复习–光电式与半导体式传感器 超声波传感器 超过2万赫兹以上的波称为超声波 压电式超声波探头常用材料是压电晶体和压电陶瓷。它是利用压电材料的压电效应来工作的。 逆压电效…...

matlab概率论例子

高斯概率模型&#xff1a; [f,xi] ksdensity(x): returns a probability density estimate, f, for the sample in the vector x. The estimate is based on a normal kernel function, and is evaluated at 100 equally spaced points, xi, that cover the range of the da…...

Appium+python自动化(一)- 环境搭建—上(超详解)

简介 今天是高考各地由于降水&#xff0c;特别糟糕&#xff0c;各位考生高考加油&#xff0c;全国人民端午节快乐。最近整理了一下自动化的东西&#xff0c;先前整理的python接口自动化已经接近尾声。即将要开启新的征程和篇章&#xff08;Appium&python&#xff09;。那么…...

基于SpringBoot的精简博客系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的精简博客系统,java项目…...

STM32的在线升级(IAP)实现方法:BOOT+APP原理详解

0 工具准备 Keil uVision5 Cortex M3权威指南&#xff08;中文&#xff09; STM32参考手册 1 在线升级&#xff08;IAP&#xff09;设计思路 为了实现STM32的在线升级&#xff08;IAP&#xff09;功能&#xff0c;通常会将STM32的FLASH划分为BOOT和APP两个部分&#xff0c;BOO…...

【芯片DFX】Arm调试架构篇

【芯片DFX】万字长文带你搞懂JTAG的门门道道【芯片DFX】ARM:CoreSight、ETM、PTM、ITM、HTM、ETB等常用术语解析...

ES应用_ES实战

依靠知识库使用es总结一些使用技巧。 1 快速入门 ES是将查询语句写成类似json的形式&#xff0c;通过关键字进行查询和调用。 1.1 创建 下面创建了一个主分片为5&#xff0c;副本分片为1的ES结构。ES本身是一种noschema的结构&#xff0c;但是可以通过指定mapping编程schema的…...

Ubuntu上如何找到设备,打印串口日志

dmesg 找设备 sudo mincom -s 配置minicom mincom 打印串口日志 PS: Windows上使用MobaXterm / putty / Xshell / SecureCRT等 ubuntu串口的安装和使用&#xff08;usb转串口&#xff09;_ubuntu上如何把usb设备映射到tty-CSDN博客...

本地映射测试环境域名,解决登录测试环境后,也可以使用本地域名访问,可以正常跑本地项目

问题&#xff1a;单点登录进入系统不使用token&#xff0c;是将token携带在cookie中&#xff0c;登录成功后每次调用接口&#xff0c;都会在cookie中自动携带&#xff0c;这样导致即使在本地使用proxy代理解决了跨域&#xff0c;但由于本地域名不一致&#xff0c;也无法进行本地…...

VSCode使用Remote SSH远程连接Windows 7

结论 VSCode Server不能启动&#xff0c;无法建立连接。 原因 .vscode-server 目录中的 node.exe 无法运行。 原因是Node.js仅在Windows 8.1、Windows Server 2012 R2或更高版本上受支持。 由于vscode基于node.js v14&#xff0c;不支持Windows 7操作系统。 另&#xff…...

uniapp中uview组件库丰富的Calendar 日历用法

目录 基本使用 #日历模式 #单个日期模式 #多个日期模式 #日期范围模式 #自定义主题颜色 #自定义文案 #日期最大范围 #是否显示农历 #默认日期 基本使用 通过show绑定一个布尔变量用于打开或收起日历弹窗。通过mode参数指定选择日期模式&#xff0c;包含单选/多选/范围…...

云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd) 5.master2节点迁移容器运行时(docker → containerd) 6.node1节点容器运行时迁移(docker → containerd) 7.升级集群计划&#xff08;v1.23.14 → v1.24.1&#…...

Redis 数据结构和常用命令

* 代表多个&#xff0c;&#xff1f;代表一个 &#xff08;不用全部敲出来&#xff0c;按住tab可以自动补全&#xff09; -2是无效&#xff0c;-1是永久有效 &#xff1b;贴心小提示&#xff1a;内存非常宝贵&#xff0c;对于一些数据&#xff0c;我们应当给他一些过期时间&a…...

Docker 容器命令总汇

目录 1、创建Docker容器&#xff08;不启动&#xff09; 2、创建Docker容器&#xff08;启动&#xff09; 3、列出正在运行的容器 4、停止和启动容器 5、重启容器 6、进入容器 7、查看容器信息 8、查看容器日志 9、删除容器和镜像 10、重命名容器 11、从旧容器复制数…...

react + redux 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地&#xff08;内置了基础静态组件和模版&#xff09; git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务&#xff08;内置了json-server&#xff09; npm run serve 启动前端服务 npm…...

【形式语言与自动机/编译原理】CFG-->Greibach-->NPDA(2)

本文将详细讲解《形式语言与自动机》&#xff08;研究生课程&#xff09;或《编译原理》&#xff08;本科生课程&#xff09;中的上下文无关文法&#xff08;CFG&#xff09;转换成Greibach范式&#xff0c;再转成下推自动机&#xff08;NPDA&#xff09;识别语言是否可以被接受…...

14.用户管理

目录 1、权限表 1、user表 1.用户列 2.权限列 3.安全列 4.资源控制列 2、db表和host 表 1.用户列 2.权限列 3. tables_priv 表和 columns _priv 表 4.procs_priv 表 2、账户管理 1. 登录和退出MySQL服务器 2、创建普通用户&#xff1a; 1.使用CREATE USER语创建…...

【交叉编译环境】安装arm-linux交叉编译环境到虚拟机教程(简洁版本)

就是看到了好些教程有些繁琐&#xff0c;我就写了一个 我这个解压安装的交叉编译环境是Linaro GCC的一个版本&#xff0c;可以用于在x86_64的主机上编译arm-linux-gnueabihf的目标代码 步骤来了 在你的Ubuntu系统中创建一个目录&#xff0c;例如/usr/local/arm&#xff0c;然后…...

YimMenu终极指南:免费GTA5辅助工具完整使用教程

YimMenu终极指南&#xff1a;免费GTA5辅助工具完整使用教程 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...

BatchNorm实战避坑指南:为什么你的小批量训练总是不稳定?

BatchNorm实战避坑指南&#xff1a;小批量训练不稳定的深层解析与解决方案 1. 问题背景&#xff1a;为什么小批量训练总是不稳定&#xff1f; 在深度学习实践中&#xff0c;Batch Normalization&#xff08;批归一化&#xff09;已成为许多模型架构的标准组件。然而&#xff0c…...

3个关键步骤:快速搭建Arduino ESP32开发环境的终极指南

3个关键步骤&#xff1a;快速搭建Arduino ESP32开发环境的终极指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要开始ESP32物联网开发却卡在环境配置上&#xff1f;作为Arduino生态…...

【CryptoJS】------CryptoJS版本选择与下载指南

1. CryptoJS简介与版本选择策略 CryptoJS是一个纯JavaScript实现的加密算法库&#xff0c;支持常见的哈希算法&#xff08;如MD5、SHA系列&#xff09;、对称加密&#xff08;如AES、DES&#xff09;和非对称加密&#xff08;如RSA&#xff09;。我在实际项目中使用这个库已有…...

浪潮 NF5270M4 装 ESXi 8.0 识别不到 RAID1?这样设置一次搞定

最近很多机友遇到了核心问题&#xff1a;RAID1 已创建&#xff0c;但 ESXi 8.0U3i 只看到两块独立 SATA 盘&#xff0c;没识别出 RAID 逻辑盘。这是浪潮 NF5270M4 ESXi 8.0 的典型兼容性 / 驱动 / 配置问题&#xff0c;按下面步骤排查即可解决。一、先确认核心前提(必做)1、你…...

【水果分类】基于GUI计算机视觉和前馈神经网络自动水果分类系统附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

74HC595驱动8位数码管实战:从查找表到动态扫描的完整流程

74HC595驱动8位数码管实战&#xff1a;从查找表到动态扫描的完整流程 在嵌入式系统开发中&#xff0c;数码管显示是最基础也最考验硬件理解能力的环节之一。记得我第一次尝试用74HC595驱动数码管时&#xff0c;被那个"看似简单却暗藏玄机"的动态扫描原理折磨了整整三…...

Kafka Connect集群管理可视化界面:高效实现多环境连接器配置实战指南

Kafka Connect集群管理可视化界面&#xff1a;高效实现多环境连接器配置实战指南 【免费下载链接】kafka-connect-ui Web tool for Kafka Connect | 项目地址: https://gitcode.com/gh_mirrors/ka/kafka-connect-ui 在Kafka生态系统中&#xff0c;连接器管理一直是数据…...

Spring Authorization Server设备授权深度实践:从协议解析到企业落地

Spring Authorization Server设备授权深度实践&#xff1a;从协议解析到企业落地 【免费下载链接】spring-authorization-server Spring Authorization Server 项目地址: https://gitcode.com/gh_mirrors/sp/spring-authorization-server 一、概念解析&#xff1a;为什么…...

CVPR/ICML/TMI顶会风向标:医学图像分割三大落地范式,从模型精调到临床闭环

1. 医学图像分割的临床落地挑战与范式转变 医学图像分割作为AI在医疗领域最成熟的应用之一&#xff0c;正经历着从实验室精度竞赛到临床实用落地的关键转型。我在参与多家三甲医院PACS系统智能化改造时发现&#xff0c;临床医生对算法的需求呈现明显的"三高"特征&…...