引言
上一节我们讲到如何用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清除操作。当我们采用了这个宏,表示这个函数无论如何将做保留操作。
那么在编