当前位置: 首页 > wzjs >正文

上海家装设计网站网页设计与制作步骤流程

上海家装设计网站,网页设计与制作步骤流程,在线修图网站,可以在哪些网站 APP做推广上一篇文章介绍了javaScript如何调用简单的加法运算,该js的编译是采用cmd指令进行的,今天我为大家介绍如何使用QtCreator的WebAssembly套件编译成js、wasm,并且让javascript进行调用。 那么还是以简单的加法运行为例。 功能介绍 开发环境&…

上一篇文章介绍了javaScript如何调用简单的加法运算,该js的编译是采用cmd指令进行的,今天我为大家介绍如何使用QtCreator的WebAssembly套件编译成js、wasm,并且让javascript进行调用。

那么还是以简单的加法运行为例。

功能介绍

开发环境:win11 + Qt 6.8.2

1:创建一个简单项目

打开QtCreator开发工具,选择一个模块,按照下面的步骤进行操作

 

 2:添加导出函数

因为只是导出一个简单的加法函数,直接在"main.cpp"中添加就可以了。

程序创建后未曾修改过的的"main.cpp"

 添加"add"导出函数

#include <emscripten.h>
extern "C" EMSCRIPTEN_KEEPALIVE int add(int a, int b) 
{return a + b;
}

代码解析:将 add 函数以 C 语言的链接方式导出到 WebAssembly 模块中,并确保其不被编译器删除。

使用场景:当需要通过 JavaScript 调用 C++ 函数时(例如在 Qt Creator 编译的 WebAssembly 项目中),此代码为函数提供了跨语言调用的桥梁。

此时没有涉及到页面操作,所以去除了main函数里面的内容,对mian函数的修改,如下:

int main()
{return 0;
} // 必须保留main函数

踩坑:在这里必须要保留main函数,否则生成的js胶水代码被html调用时在浏览器中会有callMain未定义的错误!!!

完整的main.cpp的代码,如下:

#include <emscripten.h>extern "C" EMSCRIPTEN_KEEPALIVE int add(int a, int b) {return a + b;
}int main()
{return 0;
} // 必须保留main函数

3:修改pro配置信息

原始未修改的pro文件,如下所示:

 1:去除widget文件的调用

2:添加生成目录

为了方便查找到生成的js文件,可以添加生成目录

 好了到这里对代码的修改就已经完成了,对项目进行清除、构建。程序应该是不会出问题的,如果有问题,请私信我哟~咱们一块解决!

编译完成后,就可以看到bin文件夹下面的内容了。

 4:html调用胶水代码

在bin目录下创建一个xx.html文件,用来调用SingleThreadDemo.js文件。

假设调用胶水代码的html名称是:demo1.html

步骤一

调用SingleThreadDemo.js文件

<script type="text/javascript" src="SingleThreadDemo.js"></script>

先加载文件,加载完成后再进行操作,等待js文件加载完以后再做处理。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>调用 SingleThreadDemo</title><script type="text/javascript" src="SingleThreadDemo.js"></script>
</head>
<body><script>document.addEventListener('DOMContentLoaded', async () => {try {console.log('SingleThreadDemo.js已定义!加载完成!');} catch (error) {console.error('模块初始化或调用函数时出错:', error);}});</script>
</body>
</html>

步骤二

在bin文件夹下打开cmd命令行,启动python服务

python -m http.server

 步骤三

使用谷歌浏览器打开demo1.html查看控制台信息,SingleThreadDemo.js胶水代码是否加载成功。

输入地址:http://localhost:8000/demo1.html

 发现控制台有一个404的错误

 在谷歌浏览器中也同样有错误输出

 解决方法:

因为在bin文件夹中没有找到favicon.ico图片资源,导致有问题。该图片其实是Qt的图标,只需要从电脑中搜索到该图片后,拷贝到bin文件中,就不会出现这个问题了。

 此时,再一次在浏览器中打开"localhost:8000/demo1.html"地址,就不会再报错了。

 使用document.addEventListener监听整个文档,事件触发时,执行传入的回调函数,使用try/catch方法捕获异步操作中的错误,比如:文件加载失败、函数调用异常等等,方便我们排查错误。

步骤四

调用SingleThreadDemo.js胶水代码。这也是调用的最核心部分了!

首先,打开SingleThreadDemo.js胶水代码,发现虽然只导出了一个加法函数,但是js居然有一万多行代码,很是震惊呀!

直接将代码拉到最底端,会有一个导出方法,如下:

if (typeof exports === 'object' && typeof module === 'object')module.exports = SingleThreadDemo_entry;
else if (typeof define === 'function' && define['amd'])define([], () => SingleThreadDemo_entry);

这句代码时一个典型的UMD(Universal Module Definition)模式,让 SingleThreadDemo_entry 模块在不同的 JavaScript 环境中(如 CommonJS、AMD 或全局变量)都能被正确导出。

由此得出,在demo.html中使用胶水代码时,导出的模块是:SingleThreadDemo_entry。

我在看其他博友给出的例子中,很多都是使用Module的调用,比如:

 刚开始调用的时候,我也是拿着"Module"来操作,但是浏览器控制台一直输出,Module找不到,于是我就顺着这个思路开始解决,走了好几天弯路,我才明白,别人使用Module能成功是因为导出的名称叫Module,而我导出的胶水代码中时SingleThreadDemo_entry

 既然知道该如何正确使用导出模块后,那就尝试使用加法函数吧!

步骤五

在demo1.html中输出SingleThreadDemo_entry是什么类型?

console.log('类型是:',typeof SingleThreadDemo_entry());

经过运行后发现,此时SingleThreadDemo_entry()是一个object,那么该如何访问它里面的函数呢?

SingleThreadDemo_entry().then(function(module){console.log('SingleThreadDemo_entry().then(function(module)');var result = module._add(7,4);console.log("5 + 3 =", result); // 应该输出 8
});

代码解析分析:

1:SingleThreadDemo_entry()

调用模块入口函数,返回Promise,因为加载模块是一个异步操作,使用Promise可以很好的处理这个过程。

该函数有三个返回状态

  • pending(进行中):初始状态,表示异步操作还在进行中。
  • fulfilled(已成功):表示异步操作已经成功完成。
  • rejected(已失败):表示异步操作失败。

2:.then()方法

.then()是Promise对象的方法,用于注册回调函数。它接受两个可选参数:

  • 第一个参数:是一个回调函数,当 Promise 对象的状态变为 fulfilled 时,这个回调函数会被执行。
  • 第二个参数:也是一个回调函数,当 Promise 对象的状态变为 rejected 时,这个回调函数会被执行。不过在 SingleThreadDemo_entry().then(function(module) { ... }) 中,只提供了第一个参数。

3:function(module) {...}

回调函数,这是传递给.then()方法的回调函数,当SingleThreadDemo_entry返回的Promise对象编程fulfilled时,这个回调函数会被调用。

参数modulePromise解决的值,通常在加载WebAssembly模块的场景中,module可能是加载完成的WebAssembly模块实例,通过这个实例可以调用模块导出的函数。

完整的html代码,如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>调用 SingleThreadDemo</title><script type="text/javascript" src="SingleThreadDemo.js"></script>
</head>
<body><script>document.addEventListener('DOMContentLoaded', async () => {try {console.log('SingleThreadDemo.js已定义!加载完成!');if(typeof SingleThreadDemo_entry === 'undefined'){	console.error('SingleThread2_entry未定义,请检查胶水代码');return;}console.log('类型是:',typeof SingleThreadDemo_entry());SingleThreadDemo_entry().then(function(module){console.log('SingleThreadDemo_entry().then(function(module)');var result = module._add(7,4);console.log("7 + 4 =", result); });} catch (error) {console.error('模块初始化或调用函数时出错:', error);}});</script>
</body>
</html>

还有另一种调用方式,也可以成功

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>调用 SingleThreadDemo</title><script type="text/javascript" src="SingleThreadDemo.js"></script>
</head>
<body><script>console.log('typeof SingleThreadDemo_entry = ', typeof SingleThreadDemo_entry);SingleThreadDemo_entry().then((instance) => {console.log('现在 instance 是你需要的实例对象');var resultAdd = instance._add(5, 6);console.log('result = ', resultAdd);}).catch((error) => {console.error('加载 WebAssembly 模块时出错:', error);});</script>
</body>
</html>

好了,重新启动下"http://localhost:8000/demo1.html"就能看到输出结果了!

简单的使用QtCreator的WebAssembly编译的加法导出函数已经讲解完了,希望对一些初学者有帮助哟!

我是糯诺诺米团,一名C++程序媛~


文章转载自:

http://qe1GCyYq.tqwcm.cn
http://SgvzppTn.tqwcm.cn
http://yoJYPCCP.tqwcm.cn
http://hlYh4ooA.tqwcm.cn
http://PtdddBBQ.tqwcm.cn
http://YmUZZ9HK.tqwcm.cn
http://X5tYKq8g.tqwcm.cn
http://suFIMQ6P.tqwcm.cn
http://BqPcmGqr.tqwcm.cn
http://gXTpdWmG.tqwcm.cn
http://RJXdwJNl.tqwcm.cn
http://TfxarKbo.tqwcm.cn
http://FP9vVhLX.tqwcm.cn
http://I2hs1S2H.tqwcm.cn
http://2eSLoihw.tqwcm.cn
http://dH9bSwIx.tqwcm.cn
http://aXNY5dqk.tqwcm.cn
http://6kKiEy5G.tqwcm.cn
http://sJiKHX39.tqwcm.cn
http://SprhWJBl.tqwcm.cn
http://Gks3UYQi.tqwcm.cn
http://tTezNHaj.tqwcm.cn
http://Upbx82K4.tqwcm.cn
http://YYrVZPN9.tqwcm.cn
http://1iTC55q1.tqwcm.cn
http://Cmm6u8JF.tqwcm.cn
http://5mUeC1Jc.tqwcm.cn
http://n9UDnQd2.tqwcm.cn
http://WPJn5CsL.tqwcm.cn
http://tsLHbJgp.tqwcm.cn
http://www.dtcms.com/wzjs/687902.html

相关文章:

  • 品牌网站建设小蝌蚪1返佣网站都是自己做的
  • 仿视频网站开发智能小程序开发
  • 如何建小企业网站深圳网络推广工资
  • 邯郸做网站的公司建设公司是什么意思
  • iis网站asp.net部署wordpress菜单页面跳转
  • 石家庄免费网站建设腾讯的wordpress怎么样
  • 广西省建设注册管理网站公司注册域名需要哪些条件
  • 网上商城网站开发公司如何做赚钱的网站
  • 电子商务网站开发的任务书我局 负责 建设 网站
  • 长沙网站建设260ewordpress在线
  • 网站前端设计培训黄石网站网站建设
  • dw做网站首页长宽设置多少腾讯云主机
  • 好看的ui网站页面设计有找专业做淘宝网站的美工
  • 电商网站建设的现实意义是什么主题公园网站建设
  • 百度收录检测如何优化网站标题
  • 网站建设中标公告如何使用云服务建设网站
  • 大连科技学院官方网站的建设与放店铺logo在线免费制作
  • 福州网站制作有限公司网站开发报价单
  • 做网站的网站赚钱吗外发加工会计分录
  • 德兴市网站建设服务公司成都seo培训班
  • 毕业设计可以做自己的网站吗住房和城乡建设岗位证书
  • 长垣做网站两学一做教育纪实评价系统网站
  • 室内装饰设计师证书seo推广营销网站
  • 安全认证的机票网站成就怎么做装修设计案例网站
  • 做asp网站教程wordpress 目录样式
  • 搭建网站要不要给域名对方wordpress 手机首页设置
  • 建设专业网站电话咨询珠海网站建设网
  • 酒店宾馆客栈旅馆古典网站源码 asp源码带后台乐清seo公司
  • 网站做外链平台有哪些免费
  • 哪个网站课件做的比较好做装修的网站有哪些内容