如何将C/C++代码转成webassembly(Linux环境)

news2024/11/24 14:20:08

如何将C/C++代码转成webassembly_omage的博客-CSDN博客学习如何将C/C++代码转成webassemblyhttps://blog.csdn.net/omage/article/details/128163526?spm=1001.2014.3001.5501     上篇笔者分享了在window环境下如何将C/C++代码编译成webassembly,当中用了非常简单的C代码做了示例,然后在按照官网的一篇指南进行实践时,发现在window环境下编译有很多C代码的文件时不太方便,示例当中的命令也只能适用于linux环境。
Compiling an Existing C Module to WebAssembly - WebAssembly | MDNA core use-case for WebAssembly is to take the existing ecosystem of C libraries and allow developers to use them on the web.https://developer.mozilla.org/en-US/docs/WebAssembly/existing_C_to_wasm

     为此,笔者干脆使用win10下的Linux子系统作为环境来实践下如何在linux环境编译。那如何在win10下安装Linux子系统的文章网上一大把,我就不赘述了。

       注:笔者Linux子系统安装的是Debian

     配置国内镜像

进入linux子系统

  wsl  

安装CA证书工具包,后面切换到国内镜像用的到 

  sudo apt-get update

  sudo apt-get install ca-certificates

 备份/etc/apt/sources.list文件

  修改/etc/apt/sources.list文件,内容如下

deb https://mirrors.tencent.com/debian/ bullseye main non-free contrib
deb-src https://mirrors.tencent.com/debian/ bullseye main non-free contrib
deb https://mirrors.tencent.com/debian-security/ bullseye-security main
deb-src https://mirrors.tencent.com/debian-security/ bullseye-security main
deb https://mirrors.tencent.com/debian/ bullseye-updates main non-free contrib
deb-src https://mirrors.tencent.com/debian/ bullseye-updates main non-free contrib
deb https://mirrors.tencent.com/debian/ bullseye-backports main non-free contrib
deb-src https://mirrors.tencent.com/debian/ bullseye-backports main non-free contrib

   安装Emscripten SDK (简称emsdk)   

安装前先安装git和python3

sudo apt-get install git
sudo apt-get install python3

克隆emsdk 

        git clone https://gitee.com/openeuler-graphics/emsdk.git

 安装

git checkout main
 
./emsdk install latest

./emsdk activate latest

source ./emsdk_env.sh

 验证安装是否成功

emcc -v

如出现如下信息表示安装成功了 

emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.22 (a9981ae2a7dc3c45f833d0b2202f739d87ac05c8)
clang version 16.0.0 (https://github.com/llvm/llvm-project 8491d01cc385d08b8b4f5dd097239ea0009ddc63)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/ouyang/data/emsdk/upstream/bin

  编译一个已有的C代码库

  (上面示例用的是libwebp代码)   

git clone https://github.com/webmproject/libwebp

   在libwebp目录下新建一个webp.c文件

 内容如下

#include "emscripten.h"
#include "src/webp/encode.h"

EMSCRIPTEN_KEEPALIVE
int version() {
  return WebPGetEncoderVersion();
}

 进入代码目录,运行

mkdir -p target

  

emcc -s EXPORTED_RUNTIME_METHODS='["cwrap"]' -I . webp.c ./src/{dec,dsp,demux,enc,mux,utils}/*.c -o target/mylib.js

注:这个 -I参数很奇怪,在emcc帮助和文档里查不到,从实践情况看应该是指设定代码编译的根目录,会影响你的代码文件里的引用路径。 

上述命令编译成功后,会在target目录生成mylib.js、mylib.wasm文件。

然后我们在写一个简单的mylib.html文件,内容如下

<!doctype html>
<html lang="en-us">
<body>

<script src="./mylib.js"></script>
<script>
  Module.onRuntimeInitialized = async () => {
    const api = {
      version: Module.cwrap("version", "number", []),
    };
    console.log(api.version());
  };
</script>
</body>
</html>

    将这三个文件部署到您的web服务上,笔者使用nodejs + koa的方式来做web服务,具体代码可参考如何将C/C++代码转成webassembly_omage的博客-CSDN博客

   在浏览器输入地址: http://127.0.0.1:3000/mylib.html

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

避免踩坑的Github学生认证申请教程

避免踩坑的快速Github学生认证申请教程 直接上干货&#xff01; 踩坑在于&#xff1a; 用了校卡以及在线验证报告无法通过Github学生认证&#xff0c; 需要用英文版的在线验证报告&#xff08;网页版翻译就可以&#xff09;的截图点击upload&#xff08;无需拍照&#xff09;&a…

【信息检索与数据挖掘期末复习】(五)Language Model

什么是语言模型&#xff1f; 一个传统的语言生成模型可以用于识别或生成字符串 我们可以将有穷自动机看作是一种确定性的语言模型 基本模型&#xff1a;每一个文档都是通过一个像这样的自动机生成的&#xff0c;只不过这种自动机是有概率的 一种最简单的语言模型等价于一个…

阿拉伯糖偶联核苷酸,UDP-b-L-arabinopyranose disodium salt,UDP-β-L-Ara.2Na

产品名称&#xff1a;阿拉伯糖偶联核苷酸 英文名称&#xff1a;UDP-b-L-arabinopyranose disodium salt&#xff0c;UDP-β-L-Ara.2Na CAS号&#xff1a;15839-78-8 分子式&#xff1a;C14H22N2O16P2 分子量&#xff1a;536.27600 纯度&#xff1a;98% 规格&#xff1a;1mg …

从零开始的Linux 阿里云ECS服务器搭建、FileZilla和宝塔

云服务器ECS概述 云服务器ECS&#xff08;Elastic Compute Service&#xff09;是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS级别云计算服务&#xff0c;让您像使用水、电、天然气等公共资源一样便捷、高效地使用服务器&#xff0c;免去了您采购IT硬件的前期准备&#x…

会员一卡通是什么?

昨天我们讨论了收银系统和给公众号的联合使用&#xff0c;最大的功能就是实现会员卡电子化、双方可以互动交流、会员账号信息随时可查看&#xff0c;但如果店铺比较小&#xff0c;不愿意花时间经营公众号或者小程序&#xff0c;那么还有什么办法做到电子会员卡呢? 会员一卡通可…

Java9-17新特性一览,了解少于3个你可能脱节了

前言 Java8出来这么多年后&#xff0c;已经成为企业最成熟稳定的版本&#xff0c;相信绝大部分公司用的还是这个版本&#xff0c;但是一眨眼今年Java19都出来了&#xff0c;相信很多Java工程师忙于学习工作对新特性没什么了解&#xff0c;有的话也仅限于某一块。 本篇就是博主对…

基于N32G45的OLED驱动

基于N32G45的OLED驱动 基于N32G45硬件SPI驱动OLED屏幕1.OLED简介 OLED&#xff0c;即有机发光二极管&#xff08; Organic Light Emitting Diode&#xff09;。 OLED 由于同时具备自发光&#xff0c;不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用…

RPC模型

这里写目录标题1. 简介2. RPC有理函数模型3. 优秀的RPC相关知识博文3.1 RPC和RPB文件相关信息3.2 Matlab实现RPC正算反算3.3 使用Gdal进行批量的影像RPC正射校正3.4 &#xff08;Python&#xff09;卫星RPC有理多项式模型读取与正反投影坐标计算原理与实现3.5 高分影像批处理第…

感知算法工程师面试===目标检测===YOLO V4(改)

感觉V3 到V4&#xff0c;YOLO的整体架构并没有重大的改进&#xff0c;只是增加了很多的trick 先展示一下V4的整体网络结构 ↑\uparrow↑这个是对比V3的 如图可见&#xff0c;V4的结构依然是主干网络金字塔头部检测器&#xff0c;所有的改进都是为了更好更快的检测目标。 ↑\…

02-SpringBoot基础

一、回顾 二、知识目标 SpringBoot概述【了解】 SpringBoot快速入门【掌握】 SpringBoot启动原理【重点】 SpringBoot配置文件【掌握】 SpringBoot属性注入【掌握】 三、为什么使用SpringBoot&#xff1f; -SSM开发有哪些痛点&#xff1f; 1、在早期我们都是使用的是SSM来…

web前端期末大作业:美食网站设计与实现——HTML+CSS+JavaScript休闲美食餐饮公司网站静态模板(6个页面)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

POI在指定excel插入行java

我想在第三行&#xff0c;插入数据库的数据&#xff0c;这里假如数据库有10条&#xff0c;并且继承第二行的格式 数据库数据 {"clark",25}&#xff0c;我写个json对象&#xff0c;10条这个 造数据代码 JSONArray jsonArray new JSONArray();for (int i 0; i <…

Mac 安装mysql8.0

1. 确认下载的版本 并下载dmg文件 官网下载dmg安装文件 &#xff0c;查看自己电脑用的是什么芯片 选择对应版本的安装包&#xff0c;终端命令&#xff1a; uname -a 参考&#xff1a;http://www.yaotu.net/biancheng/13817.html 系统偏好设置里是 英特尔的i7处理器 并且查询…

可观测性-Metrics-Tomcat连接数、线程数理解以及压测记录

文章目录背景原理压测5个并发压测10个并发压测60个并发压测61个并发压测背景 为了搞懂Tomat的连接线程模型&#xff0c;搞清楚每个配置参数的作用&#xff0c;实际压测看一下是否与预期一致。 Tomcat配置如下&#xff1a; server:# tomcat配置tomcat:# 允许最大连接数,默认8…

磁盘和文件系统管理(一)

检测并确认新硬盘 fdisk命令 查看或管理磁盘分区 fdisk -l [磁盘设备] 或 fdisk [磁盘设备] 交互模式中的常用指令 m、p、n、d、t、w、q d delete a partition * 删除分区 g create a new empty GPT partition table 创建一个新的空的GPT分区表(可以对大于2T磁盘进行分区) l…

Java - Object#finalize在JDK9中被标记废弃了!

Java - Object#finalize在JDK9中被标记废弃了&#xff01; 时间&#xff1a;2022年12月6日01:34:10 目录&#xff1a; ① 为什么要废弃&#xff1f; ② 废弃后&#xff0c;使用什么方式主动监测对象是否被回收&#xff1f; 一、为什么要废弃&#xff1f; ⚡注意&#xff1a;废…

ChatGPT成精了!

最近几天&#xff0c;朋友圈、公众号都被 ChatGPT 刷屏了。 更有不少标题党吹嘘 “谷歌要完&#xff0c;百度也危了”。 那么它到底有没有网上吹的这么神奇呢&#xff1f; 我亲测了一把&#xff0c;感觉确实非常惊艳&#xff01; 例如&#xff1a; 看着还不错&#xff0c;每…

20221206英语学习

今日新词&#xff1a; outwards adv.向外, 朝外 outrage n.义愤&#xff0c;愤慨&#xff1b;暴行&#xff0c;骇人听闻的事件 drown v.淹没, 溺死, 浸透, 浸泡 visit n.访问, 参观, 看望, 游览 setting n.环境, 背景, &#xff08;戏剧、小说等的&#xff09;情节背景&am…

面试题: Hive-SQL查询连续活跃登录用户思路详解

文章目录创造数据登录日志去重一、思路一1.1、分组排序1.2、日期减去计数值得到结果, 用户连续登陆情况下&#xff0c;每次相减的结果都相同1.3、根据 user_id 和 dis 分组&#xff0c;得到用户的 开始、结束时间、连续登录天数1.4、连续登录超过两天用户二、思路二&#xff1a…

【Rust日报】2022-12-05 探索 docker 的 WASM 技术预览

探索 docker 的 WASM 技术预览docker于近日发布了支持 WASM 容器的预览版本,本文带你体验使用 Rust 编写代码,并且编译成 WASM 最终运行于 docker 的过程.原文链接: https://medium.com/shyamsundarb/exploring-docker-hubs-wasm-technical-preview-76de28c3b1b4使用 Rust 破解…