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"]
目录
相关文章
|
安全 C# 开发工具
模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
模拟.NET实际应用场景,综合应用三个主要知识点:一是使用dnSpy反编译第三库及调试,二是使用Lib.Harmony库实现第三库拦截、伪造,三是实现同一个库支持多版本同时引用。
模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
|
25天前
|
Go 数据处理 开发者
Go 语言的反射机制允许程序在运行时动态检查和操作类型信息,提供极大的灵活性和扩展性
Go 语言的反射机制允许程序在运行时动态检查和操作类型信息,提供极大的灵活性和扩展性。本文探讨了反射的基本原理、主要操作、应用场景及注意事项,并通过实例展示了反射的实际应用,帮助开发者更好地理解和使用这一强大特性。
29 2
|
4月前
|
存储 缓存 NoSQL
在 Go 中使用接口进行灵活缓存
在 Go 中使用接口进行灵活缓存
|
4月前
|
开发框架 自然语言处理 Java
跨平台服务开发的利器——深入解析Thrift Compiler的工作机制与内部实现细节!
【8月更文挑战第18天】在现代软件开发中,代码生成器日益重要,能根据特定输入自动生成源代码,提高效率与可维护性。Thrift作为跨平台多语言框架,通过IDL文件定义数据和服务接口,并据此生成多语言代码,涵盖序列化、方法调用等。以示例IDL定义为例,Thrift Compiler生成服务端骨架与客户端代码框架,便于开发者添加业务逻辑。深入源码,“compiler/cpp/src/thriftl”目录下的组件负责词法、语法分析及代码生成,映射IDL至特定语言,体现编译原理与跨语言设计精髓。
75 0
|
4月前
|
前端开发 开发者
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。本文阐述 DefinePlugin 的原理、用法及案例,包括安装配置、具体示例(如动态加载资源、配置接口地址)和注意事项,帮助开发者更好地利用此插件优化项目。
115 0
|
6月前
|
人工智能 Rust 安全
WebAssembly运行时库(WASM runtime:wasmer 或 wasmtime)\将rust官方demo猜数字编译为WASI目标并使用Wasmer运行
WebAssembly运行时库(WASM runtime:wasmer 或 wasmtime)\将rust官方demo猜数字编译为WASI目标并使用Wasmer运行
111 2
|
7月前
|
编译器 Linux C语言
Valgrind兼容性解析:从核心依赖到错误诊断
Valgrind兼容性解析:从核心依赖到错误诊断
264 0
|
开发工具 Android开发 git
JitPack让第三方依赖更简单(第一种方法)
JitPack让第三方依赖更简单(第一种方法)
JitPack让第三方依赖更简单(第二种方法)
JitPack让第三方依赖更简单(第二种方法)
VC 不同版本代码注入的区别
VC 不同版本代码注入的区别
67 0