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.hqwc.cn/news/540613.html

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

相关文章

C++Qt学习——qss文件的使用

当我们使用好多控件&#xff0c;比如QLabel和PushButtun的时候&#xff0c;会设置不一样的style&#xff0c;如果每次都在widget.cpp里面写的话&#xff0c;代码会很不好看&#xff0c;这也就是qss文件存在的意义。 目录 1、右键res.qrc,选择Add New 2、写上名称style.qss …

排序链表的三种写法

题目链接&#xff1a;https://leetcode.cn/problems/sort-list/?envTypestudy-plan-v2&envIdtop-100-liked 第一种&#xff0c;插入排序&#xff0c;会超时 class Solution {public ListNode sortList(ListNode head) {//插入排序&#xff0c;用较为简单的方式解决ListNo…

python创建虚拟环境-Anaconda安装配置和使用

Anaconda提供了一个名为conda的包管理工具&#xff0c;可以方便地创建、管理和分享Python环境。用户可以根据自己的需要创建不同的环境&#xff0c;每个环境都可以拥有自己的Python版本、库和依赖项&#xff0c;这样就可以避免因为不同项目之间的依赖关系而导致的冲突问题。 一…

MS08-067 漏洞利用与安全加固

文章目录 环境说明1 MS08_067 简介2 MS08_067 复现过程3 MS08_067 安全加固 环境说明 渗透机操作系统&#xff1a;2024.1漏洞复现操作系统: Windows XP Professional with Service Pack 2- VL (English)安全加固复现操作系统&#xff1a;Windows XP Professional with Service …

【RPG Maker MV 仿新仙剑 战斗场景UI (三)】

RPG Maker MV 仿新仙剑 战斗场景UI 三 二级战斗指令菜单RMMV效果代码效果 仿仙剑UI代码效果 二级战斗指令菜单 仙剑1中二级战斗的菜单内容如下&#xff1a;物品、防御、围攻、逃跑、状态这五项。 现在来完成金玉其外的UI部分&#xff0c;内核具体的功能需要后期进行填充了&…

slf4j 打印当前类和方法

spring initializr 自动包含依赖&#xff0c;也可以在 pom.xml 文件中添加 slf4j 的依赖&#xff0c;指定版本 例如我这边默认版本是 1.7.36 通过添加依赖修改版本为 1.7.32 <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</arti…

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署&#xff0c;那么如何进行部署呢 1.首先需要对多个服务进行打成jar包放到服务器上 微服务一般maven文件有一个父类的pom.xml&#xff0c;需要将pom.xml删除在子类加上&#xff0c;不然会找不到主类 就是repackage这个配置&#…

Vue首屏优化方案

在Vue项目中&#xff0c;引入到工程中的所有js、css文件&#xff0c;编译时都会被打包进vendor.js&#xff0c;浏览器在加载该文件之后才能开始显示首屏。若是引入的库众多&#xff0c;那么vendor.js文件体积将会相当的大&#xff0c;影响首屏的体验。可以看个例子&#xff1a;…

uniapp无感登录封装

全局请求封装 https://blog.csdn.net/qq_42618566/article/details/109308690 无感登录封装 import {http} from "./index.js" let requestsQueue []; // 请求队列// 记录请求队列 export function recordRequests(path, params, loading, method) {requestsQueu…

vsCode html部分代码换行太多

使用vscode格式化文档的时候会出现这种情况 文件 -> 首选项 -> 设置 -> 搜索vetur -> 在setting.json中编辑。添加一下代码&#xff1a; "vetur.format.defaultFormatter.html": "js-beautify-html", "vetur.format.defaultFormatter.j…

音视频学习笔记——C++智能指针

C智能指针介绍 智能指针主要用于管理在堆上分配的内存&#xff0c;它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后&#xff0c;会在析构函数中释放掉申请的内存&#xff0c;从而防止内存泄漏。C 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法&#…

电梯机房秀

每天乘坐电梯&#xff0c;您见过电梯的机房吗&#xff1f;来&#xff0c;跟着小伍去看看吧。Lets go&#xff01; 电梯还能节能呢&#xff0c;您知道么&#xff1f;正好&#xff0c;小伍一块带您看看电梯节能装置(●◡●) 目前电梯节能装置已广泛应用于三菱、富士、日立、奥的斯…