码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何将C/C++代码转成webassembly(Linux环境)


    如何将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文件,内容如下

    1. deb https://mirrors.tencent.com/debian/ bullseye main non-free contrib
    2. deb-src https://mirrors.tencent.com/debian/ bullseye main non-free contrib
    3. deb https://mirrors.tencent.com/debian-security/ bullseye-security main
    4. deb-src https://mirrors.tencent.com/debian-security/ bullseye-security main
    5. deb https://mirrors.tencent.com/debian/ bullseye-updates main non-free contrib
    6. deb-src https://mirrors.tencent.com/debian/ bullseye-updates main non-free contrib
    7. deb https://mirrors.tencent.com/debian/ bullseye-backports main non-free contrib
    8. deb-src https://mirrors.tencent.com/debian/ bullseye-backports main non-free contrib

       安装Emscripten SDK (简称emsdk)   

    安装前先安装git和python3

    1. sudo apt-get install git
    2. sudo apt-get install python3

    克隆emsdk 

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

     安装

    1. git checkout main
    2. ./emsdk install latest
    3. ./emsdk activate latest
    4. 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文件

     内容如下

    1. #include "emscripten.h"
    2. #include "src/webp/encode.h"
    3. EMSCRIPTEN_KEEPALIVE
    4. int version() {
    5. return WebPGetEncoderVersion();
    6. }

     进入代码目录,运行

    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文件,内容如下

    1. html>
    2. <html lang="en-us">
    3. <body>
    4. <script src="./mylib.js">script>
    5. <script>
    6. Module.onRuntimeInitialized = async () => {
    7. const api = {
    8. version: Module.cwrap("version", "number", []),
    9. };
    10. console.log(api.version());
    11. };
    12. script>
    13. body>
    14. html>

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

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

     

  • 相关阅读:
    AUTOSAR基础篇之StbM
    关于NPM下载源的总结
    c刷题(四)
    彻底读懂用户线程和守护线程(代码详解)
    MySQL字符串合并
    JS07_回调函数与异步编程
    数字化转型的失败原因及成功之道
    [吃瓜教程]南瓜书第3章二分类线性判别分析
    leetcode-11. 盛最多水的容器(双指针)
    Httpd启动报错 Couldn‘t create the ssl-cache 的解决办法
  • 原文地址:https://blog.csdn.net/omage/article/details/128189492
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号