当前位置: 首页 > 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语言库了,后续测评和使用技巧不断输出。

http://www.lryc.cn/news/271081.html

相关文章:

  • 前端--基础 目录文件夹和根目录 VScode打开目录文件夹
  • 传感器原理与应用复习--超声波、微波、红外及热电偶传感器
  • matlab概率论例子
  • Appium+python自动化(一)- 环境搭建—上(超详解)
  • 基于SpringBoot的精简博客系统
  • STM32的在线升级(IAP)实现方法:BOOT+APP原理详解
  • 【芯片DFX】Arm调试架构篇
  • ES应用_ES实战
  • Ubuntu上如何找到设备,打印串口日志
  • 本地映射测试环境域名,解决登录测试环境后,也可以使用本地域名访问,可以正常跑本地项目
  • VSCode使用Remote SSH远程连接Windows 7
  • uniapp中uview组件库丰富的Calendar 日历用法
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)
  • Redis 数据结构和常用命令
  • Docker 容器命令总汇
  • react + redux 之 美团案例
  • 【形式语言与自动机/编译原理】CFG-->Greibach-->NPDA(2)
  • 14.用户管理
  • 【交叉编译环境】安装arm-linux交叉编译环境到虚拟机教程(简洁版本)
  • 感染了后缀为.[sqlback@memeware.net].2700勒索病毒如何应对?数据能够恢复吗?
  • [Linux开发工具]——vim使用
  • 【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)
  • Spring Boot日志:从Logger到@Slf4j的探秘
  • 英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置
  • 【基础】【Python网络爬虫】【6.数据持久化】Excel、Json、Csv 数据保存(附大量案例代码)(建议收藏)
  • 王道考研计算机网络——应用层
  • Android MVVM 写法
  • LeetCode 热题 100——283. 移动零
  • neovim调试xv6-riscv过程中索引不到对应头文件问题
  • 轻量应用服务器与云服务器CVM对比——腾讯云