WebAssembly01-- 暴露接口 避免编译时优化

简介: WebAssembly01-- 暴露接口 避免编译时优化

将接口暴露出来

在test.c 中直接写出如下所示的代码

vim test.c

#include<stdio.h>
int add(int a,int b)
{
return a+b;
}
int main(int argc,char** argv)
{
return add(1,2);
}

使用

emcc test.c -O2 -o test.js 编译之后

手动写个test.html

<html>
<head>
<title>test page</title>
</head>
<body>
<script src="test.js"></script>
</body>
</html>

emrun --no_browser --port 8000 test.html

在浏览器中访问这个

可以在下图中看不到add函数 并且调用add函数的main中return 直接是3

现在使用

vim test.c

#include<stdio.h>
#include<emscripten.h>
EMSCRIPTEN_KEEPALIVE int add(int a,int b)
{
return a+b;
}
int main(int argc,char** argv)
{
return add(1,2);
}

修改之后重新编译并运行emcc emrun

如下所示 add接口被暴露出来

不导出main函数

增加 --no-entry 即可避免main接口的暴露

emcc test.c --no-entry -O2 -o test.js

emrun --no_browser --port 8000 test.html

下图中可以看到add接口但是没有main

暴露接口的调用

Module调用方式

在test.html 中修改为如下

<html>
<head>
<title>test page</title>
</head>
<body>
<script >
Module={}
Module.onRuntimeInitialized=function(){
console.log("add:"+Module._add(3,5))
          }   
</script>
<script src="test.js"></script>
</body>
</html>

emrun --no_browser --port 8000 test.html

接口的调用过程

首先定义一个空的Module对象 给Module对象的onRuntimeInitialized设置了回调函数,然后 使用script标签引入test.js胶水文件 完善Module对象的其他属性,在Module对象初始化完成之后执行回调onRuntimeInitialize()方法 该方法调用Module对象的_add方法,并打印出来结果。

ccall调用方式

var result = Module.ccall(func_name,return_type,arg_types,args);
  • func_name 是要调用的c/c++函数名这里不需要加下划线
  • return_type函数返回类型字符串 比如返回类型是string 这里就应该填入string
  • arg_type调用函数的参数类型列表 比如需要传入两个字符串 则应该写成['string','string']
  • args 真实的参数 比如传入是的 “hello” "world" 则写成 ["hello","world"]
目录
相关文章
|
编译器 Linux 调度
makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS
makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS
3081 0
|
8月前
|
数据采集 人工智能 分布式计算
MCP+Hologres+LLM搭建数据分析Agent
本文探讨了LLM大模型在数据分析领域的挑战,并介绍了Hologres结合MCP协议和LLM搭建数据分析Agent的解决方案。传统LLM存在实时数据接入能力不足、上下文记忆短等问题,而Hologres通过高性能数据分析能力和湖仓一体支持,解决了这些痛点。MCP协议标准化了LLM与外部系统的连接,提升集成效率。文中详细描述了如何配置Hologres MCP Server与Claude Desktop集成,并通过TPC-H样例数据展示了分析流程和效果。最后总结指出,该方案显著提高了复杂分析任务的实时性和准确性,为智能决策提供支持。
|
JSON NoSQL Redis
ruoyi-nbcio发送消息的SerializationException: Could not read JSON: Unexpected character (‘¬‘ (code 172))
ruoyi-nbcio发送消息的SerializationException: Could not read JSON: Unexpected character (‘¬‘ (code 172))
450 0
关于QtCreator使用fcitx无法输入中文的解决方法(从根本解决问题)
关于QtCreator使用fcitx无法输入中文的解决方法(从根本解决问题)
|
Linux Python
Linux离线安装Python依赖包
本文介绍了在Linux环境下离线安装Python依赖包的方法,包括从Python依赖包检索网站下载所需依赖包的压缩文件,上传到Linux服务器,然后通过解压、编译和安装步骤完成依赖包的安装。
1090 0
|
Linux 开发工具 C语言
【研究Qt webengine 模块编译】linux 交叉编译qt5.12的webengine模块成功的条件
【研究Qt webengine 模块编译】linux 交叉编译qt5.12的webengine模块成功的条件
2112 1
|
安全 API 调度
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
|
存储 负载均衡 网络协议
常见HTTP错误码模拟
最近发现部分同学虽然知道HTTP错误码,但对产生的具体原因并不清楚,所以我打算对比较常见的错误码进行模拟,帮助大家理解。
|
JSON JavaScript 前端开发
记一次完整 C++ 项目编译成 WebAssembly 的实践
有 2W+ 行代码,一篇通用的技术方案
7119 1
记一次完整 C++ 项目编译成 WebAssembly 的实践
|
JSON 数据格式
QT网络编程: 使用QNetworkAccessManager上传post请求
QT网络编程: 使用QNetworkAccessManager上传post请求
793 0