WebAssembly编译之(4)-WASM编译进阶(多文件、多接口)

引言
上一节我们讲到如何用Emscripten将一个C编译陈wasm,并导出可供Javascirpt调用的接口,以及C++导出类的函数接口、导出类的封装对象等。然而,编译的方式比较玛法,有没办法能更友好一点实现wasm的编译呢

WASM 相关文档:
WebAssembly编译之(1)-asm.js及WebAssembly原理介绍
WebAssembly编译之(2)-Ubuntu搭建WASM编译环境
WebAssembly编译之(3)-WASM编译实战之C/C++导出asm.js及wasm库

这一节我们继续给大家介绍wasm编译进阶教程,多个文件的编译,甚至多个接口的编译。

多个C/C++接口的导出编译方法

上一节前面我们知道,每次执行emcc指令时,我们都需要在命令行中携带参数EXPORTED_FUNCTIONS=['_funsName1','_funsName2']指定需要导出的函数接口。而然,当需要导出的接口变非常多的时候,这样操作显然不太明智。怎么办呢?

1)使用EMSCRIPTEN_KEEPALIVE宏修饰C的函数

我们可以使用Emscripten给我们提供的宏指令EMSCRIPTEN_KEEPALIVE修饰。使用这个宏之前需要引入#include <emscripten.h>,同时为了避免代码提示找不到include头文件的错误信息,我们可以需要在IDE编辑器中,设置好include目录,include的目录位置一般在你的EMSDK git项目目录emsdk/upstream/emscripten/system/include/emscripten

我们还是先上代码

// HelloToolFuns.c
#include <stdio.h>
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
int myAdd(int a,int b){
   
    int res = a+b;
    return res;
}

EMSCRIPTEN_KEEPALIVE
int myMutilp(int a, int b){
   
    int s = a * b;
    return s;
}

EMSCRIPTEN_KEEPALIVE
void sayHello() {
   
      printf("Hello World!(HelloToolFuns.c)\n");
}

我们可以直接使用一个EMSCRIPTEN_KEEPALIVE修饰在需要导出的函数接口即可。在编译时,不需要指定带导出的接口函数名,只需要直接使用emcc编译即可,如下所示:

注意:cpp的函数导出也同样适用这个方法,只是,任然需要在函数的外层套一个extern "C" { }

emcc HelloToolFuns.c -o ./test-html/HelloToolFuns.js

EMSCRIPTEN_KEEPALIVE本意是保持函数的意思,怎么理解呢?Emscripten在编译时,为了保证wasm足够小,其实还会做一层删除无用函数的操作。如对于内联函数、或是未调用的函数会做DCE清除操作。当我们采用了这个宏,表示这个函数无论如何将做保留操作。

那么在编

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值