WebAssembly探索篇(二)引入第三库的简单demo

文章目录

  • 开发环境
  • demo简单介绍
  • 实践出真知
    • 各个文件内容
      • CMakeLists.txt
      • main.cpp
    • cmake 编译
    • 结果
  • 遇到问题
    • 错误1:both async and sync fetching of the wasm failed
      • vscode安装Preview on Web Server插件

    最近因为项目原因,研究了一下WebAssembly。2015年上线与JS、HTML、CSS并称web界四语言,额,虽然已经上线快10年,但是研究的人好少,注定这个探索之路是崎岖的。(事实也是这样,已经耗进去快2周了,人都麻了-_-||)
    这是刚开始一个不太顺利的demo, 按照这位大佬的文章:快速上手WebAssembly应用开发:Emscripten使用入门),纯纯javaer看不懂,仔细研读了n遍才看懂里面的代码目录。。。

开发环境

为啥要把开发环境放在第一位呢,这里面也是采了无数的坑。

开发工具版本
Ubuntu18.04
emscripten3.1.55
cmake3.28.3

demo简单介绍

纯hello world,引入了第三方库(也是下载到了本地),最后编译出来的一个简单demo

实践出真知

如下:

┌─demo              项目名称 
│─thirdparty        第三方依赖库集合 
│  └─cJson          cJson库(https://github.com/DaveGamble/cJSON)
│  │  └─cJSON.c     来源:github      
│  │  └─cJSON.h     来源:github
│  │  └─CMakeLists.txt      
├─main.cpp          主入口
├─CMakeLists.txt        

各个文件内容

CMakeLists.txt

  1. 主目录的CmakeLists文件
cmake_minimum_required(VERSION 3.8) # 根据你的需求进行修改
project(sample )include_directories(thirdparty) # 使得我们能引用第三方库的头文件set(CMAKE_EXECUTABLE_SUFFIX ".html") # 编译生成.htmladd_subdirectory(thirdparty/cJSON)add_executable(sample main.cpp)# 设置Emscripten的编译链接参数,我们等等会讲到一些常用参数
target_link_libraries(sample cjson) # 将第三方库与主程序进行链接 set_target_properties(sample PROPERTIES LINK_FLAGS "-s EXIT_RUNTIME=1 -s EXPORTED_FUNCTIONS=\"['_json_parse']\"")
  1. 子目录的CmakeLists文件
# CMakeLists.txt in the subdirectory# 添加源文件
add_library(cjson cJSON.c)

main.cpp

#include <stdio.h>
#include "cJSON/cJSON.h"int json_parse(const char *jsonstr) {cJSON *json = cJSON_Parse(jsonstr);const cJSON *data = cJSON_GetObjectItem(json, "data");printf("%s\n", cJSON_GetStringValue(data));cJSON_Delete(json);return 0;
}

cmake 编译

  1. 在demo项目目录下,创建build文件夹并进入
  2. 执行emcmake cmake ..命令,生成MakeFile
  3. 执行emmake make命令,生成sample.html, sample.js和sample.wasm
> mkdir build
> cd build
> emcmake cmake ..
> emmake make

最终目录结构如下:

┌─demo              项目名称 
│─build             编译文件(emcmake和emmake后的产物)
│  └─CMakeFile       
│  │  └─...      
│  └─thirdparty  
│  │  └─... 
│  └─cmake_install.cmake
│  └─CMakeCache.txt
│  └─Makefile
│  └─sample.html
│  └─sample.js
│  └─sample.wasm
│─thirdparty        第三方依赖库集合 
│  └─cJson          cJson库(https://github.com/DaveGamble/cJSON)
│  │  └─cJSON.c     来源:github      
│  │  └─cJSON.h     来源:github
│  │  └─CMakeLists.txt      
├─main.cpp          主入口
├─CMakeLists.txt        

结果

在Console上打印Module,发现其中的_json_parse函数了
运行后发现Module中携带了导出的函数

遇到问题

错误1:both async and sync fetching of the wasm failed

需要通过http服务器运行html ,这位博主发表的文章中说明了原因,WASM_WebAssembly简单运行-hello,world

1.浏览器上运行接从本地硬盘打开生成的 HTML 文件(hello.html)(例如 file://your_path/hello.html),你会得到一个错误信息,大意是 both async and sync fetching of the wasm failed。你需要通过 HTTP 服务器(http://)运行你的 HTML 文件——参见如何设置本地测试服务器获取更多信息。2.非浏览器上运行浏览器以外运行 .wasm 程序,系统需要提供一个 wasm 运行环境 (runtime)对嵌入式的 wasm-micro-runtime 了,简称为 WAMR云服务的运行环境,现在比较主流的是 wasmer 和 wasmtime3.浏览器运行说明 HTML文件直接在浏览器打开和本地服务器localhost打开有什么区别?最直接的区别,很容易注意到,一个是file协议,另一个是http协议。 http请求方式则是通过假架设一个web服务器,解析http协议的请求然后向浏览器返回资源信息。我们所开发的html文件最后必定是会以网页的形式部署在服务器上访问服务器上的html文件是以http的协议方式去打开,有网络交互。直接打开html文件是以file协议的方式去打开,没有网络交互	  启动http服务01.Python自带一个微型的http服务,可以通过命令行启动:python3 -m http.server 然后这个服务启动后,在浏览器输入localhost:8000即可。显示的内容是基于你启动服务时所在的路径下的文件。http.server 不推荐用于生产环境。它仅仅实现了 basic security checks 的要求。可用性: 非 Emscripten,非 WASI。此模块在 WebAssembly 平台 wasm32-emscripten 和 wasm32-wasi 上不适用或不可用02.  http-server 启动一个静态服务器,只负责当前目录的文件路由http-servernpm i http-server -gNPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准  注意http-server 和http.server的不同

vscode安装Preview on Web Server插件

对于不会启动前端demo的开发者,vscode的Preview on Web Server插件真的很棒,选中html文件右键就可以选择在浏览器或者侧边栏打开预览,棒棒哒啊~
在这里插入图片描述

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

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

相关文章

C++由动态链接库dll生成lib文件

在msvc中&#xff0c;对于动态库的使用&#xff0c;通常有两种方法&#xff0c;一种方法是动态加载&#xff0c;在程序运行过程中&#xff0c;使用LoadLibrary()、GetProcessAddress()和FreeLibrary()三个函数动态的对动态库进行加载和卸载&#xff0c;此方法在编译运行时只需要…

Java研学-SSM综合案例(二)

二 MyBatis逆向工程 1 介绍 Maven中的插件&#xff0c;可根据数据表生成实体类 Mapper 接口和 Mapper XML&#xff0c;可单独创建一个Maven项目&#xff0c;将所需的资源生成后&#xff0c;拷贝到对应的项目中(推荐)&#xff0c;或者直接在项目中使用。 2 配置pom依赖插件 &…

信息检索(十一):Nonparametric Decoding for Generative Retrieval

Nonparametric Decoding for Generative Retrieval 摘要1. 引言2. 相关工作3. 非参数解码3.1 关键优势3.2 Base Np3.3 异步 Np3.4 对比 Np3.5 聚类 4. 实验设置4.1 基线4.2 数据集和评价指标4.3 构建CE 的细节 5. 实验结果5.1 普通解码 vs Np 解码5.2 非参数解码的优点5.3 什么…

深入理解并灵活运用Java中的StringUtils工具类

前言 在Java开发中&#xff0c;Apache Commons Lang库中的org.apache.commons.lang3.StringUtils工具类提供了大量与字符串操作相关的静态方法&#xff0c;极大地简化了我们对字符串的处理工作。本文将详细介绍StringUtils工具类的主要功能和使用方法。 一、引入依赖 首先&a…

IPFoxy的正确打开方式

IPFoxy是一个全球动静态代理IP服务器软件&#xff0c;为全球用户提供优质的大数据代理服务&#xff0c;促进网络业务高校进行。目前拥有千万真实纯净IP资源&#xff0c;覆盖超过220个国家和地区&#xff0c;汇聚成优质海外代理池&#xff0c;支持http、https、socks5多种协议类…

visa卡支持美区苹果Apple id绑定

苹果手机我相信大家都很熟悉&#xff0c;所以很多小伙伴都需要绑定卡来进行一系列的体验&#xff0c;这里我使用的是559666 在绑定之前我们需要先开一张visa卡&#xff0c;点击获取 开卡步骤如下&#xff0c;按图片步骤即可开卡 卡片信息在卡中心cvc安全码里面

ATFX汇市:日本首相称尚未摆脱通缩问题,日央行加息时点或再度推迟,日系货币普跌

ATFX汇市&#xff1a;关于日本是否已经“克服通缩”的消息出现巨大矛盾。3月2日&#xff0c;外媒援引知情人士表示&#xff0c;日本政府正在讨论正式宣布经济已经克服通缩&#xff0c;日本首相岸田文雄或内阁成员之后可能会在政府会议和新闻发布会上公开发布这一声明&#xff0…

在win10下搭建linux环境的LORAWAN服务器chirpstack

文章目录 前言一、安装WSL第一步以管理员模式打开PowerShell第二步 安装WSL第三步 设置Linux用户信息 二、将WSL迁移到其他磁盘第一步 输入wsl -l -v查看ubuntu状态第二步 迁移第三步 注销原来的Ubuntu第四步 从D:\wsl-ubuntu导入 三、安装chirpstack第一步 安装git第二步 下载…

wxss和css的区别

目录 1. 语法差异 2. 尺寸单位 3. 样式导入 WXSS 示例代码&#xff1a; CSS 示例代码&#xff1a; 4. 组件和属性的支持 总结 WXSS (WeiXin Style Sheets) 和 CSS (Cascading Style Sheets) 都是用于描述文档样式的语言&#xff0c;但它们在微信小程序和网页开发中有一些…

JavaScript进阶:js的一些学习笔记-原型

文章目录 js面向对象1. 原型2. constructor属性3. 对象原型4. 原型继承5. 原型链 js面向对象 构造函数 属性和方法 function Person(name,age){this.name name;this.age age;this.play ()>{console.log(玩&#xff01;);} } const a new Person(1,12),b new Person(2…

redis中的zset的原理

一、zset有序集合的原理 如果有序集合元素个数少于128个且元素值小于64字节&#xff0c;使用压缩列表&#xff08;新版本已经废弃压缩列表改用listpack数据结构了&#xff09; 如果不满足上述条件&#xff0c;采用跳表作为redis的底层数据结构 二、压缩列表 1.由连续内存块组…

漏洞复现-金和OA系列

漏洞复现-金和OA系列 🗡金和OA jc6 RCE金和OA GetTreeDate.aspx SQL注入【新】金和OA RssModulesHttp.aspx接口SQL注入漏洞复现C6-GetSgIData.aspx SQL注入金和OA C6 GetTreeDate.aspx SQL注入金和OA C6 GetTreeDate.aspx未授权金和OA JC6 OfficeServer 任意文件上传漏洞金和…

全栈之路-新坑就绪-星野空间

感觉自己的技术栈一直没有形成一个很好的闭环 开新坑&#xff0c;准备把自己的技术栈链路打通&#xff0c; Don‘t think too much&#xff0c; just act&#xff01;[得意]

QT中connect()的参数5:Qt::DirectConnection、Qt::QueuedConnection区别

原文链接&#xff1a;https://blog.csdn.net/Dasis/article/details/120916993 connect用于连接QT的信号和槽&#xff0c;在qt编程过程中不可或缺。它其实有第5个参数&#xff0c;只是一般使用默认值&#xff0c;在满足某些特殊需求的时候可能需要手动设置。 Qt::AutoConnect…

C++ 网络编程学习五

C网络编程学习五 网络结构的更新单例模式懒汉单例模式饿汉单例模式懒汉式指针智能指针设计单例类 服务器优雅退出asio的多线程模型IOServiceasio多线程IOThreadPoolepoll 和 iocp的一些知识点 网络结构的更新 asio网络层&#xff0c;会使用io_context进行数据封装&#xff0c;…

Git的基础使用

几条铁令&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 切换分支前先提交本地的修改代码及时提交&#xff0c;提交过就不会丢遇到任何问题都不要删除文件目录&#xff0c;第一时间找人请教push前和merge前一定要pull保证代码为最新的&#xff0c;pull的时候一…

针对《Linux系统CUDA环境配置》一文的补充与学习记录

一、针对《Linux&#xff08;Ubuntu&#xff09;下适配Open3D_ML库的CUDA环境配置》一文的补充说明 ***1 Linux&#xff08;Ubuntu&#xff09;下适配Open3D_ML库的CUDA环境配置-CSDN博客一文虽然完成了Linux内核-NVIDIA显卡驱动-CUDA-cudnn的版本匹配并成功运行&#xff0c;但…

1.下载安装ESP32开发环境ESP-IDE

ESP32简介 ESP32介绍 说到ESP32&#xff0c;首先ESP32不是一个芯片&#xff0c;ESP32是一个系列芯片&#xff0c; 是乐鑫自主研发的一系列芯片微控制器。它主要的功能就是支持WiFi和蓝牙&#xff0c; ESP32指的是ESP32裸芯片。但是&#xff0c;“ESP32”一词通常指ESP32系列芯…

Python保留格式复制多个Excel工作表到汇总表并生成目录(附源码下载)

要实现这个功能&#xff0c;你可以使用openpyxl库来操作Excel文件。以下是一个简单的示例&#xff1a; 1. 首先&#xff0c;安装openpyxl库&#xff0c;如果你还没有安装的话。在命令行中输入以下命令进行安装&#xff1a; bash pip install openpyxl2. 然后&#xff0c;使用…

Unity之PUN实现多人联机射击游戏的优化

目录 &#x1f3ae;一、 跳跃&#xff0c;加速跑 &#x1f3ae;二、玩家自定义输入昵称 &#x1f345;2.1 给昵称赋值 &#x1f345;2.2 实现 &#x1f3ae;三、玩家昵称同步到房间列表 &#x1f345;3.1 获取全部玩家 &#x1f345;3.2 自定义Player中的字段 &#…