WebAssembly编译之(3)-WASM编译实战之C/C++导出asm.js及wasm库

引言

上一节我们介绍了Ubuntu下的WASM的编译环境快速搭建。这一节我们继续WASM编译相关的介绍——如何导出C/C++编写的函数库

WASM 相关文档:
WebAssembly编译之(1)-asm.js及WebAssembly原理介绍
WebAssembly编译之(2)-Ubuntu搭建WASM编译环境

单个C++文件(*.cpp)的导出

我们首先介绍一个文件(*.cpp)如何导出进行Emscripten编译成asm.jswasm。我们还是先直接上c++代码

// HelloTools.cpp
#include <iostream>

class HelloTools{
   
    public:
    void print(int a, int b);
    int add(int a, int b);
};

void HelloTools::print(int a, int b){
   
    std::cout<<"a+b="<<a<<"+"<<b<<"="<<a+b<<std::endl;
}

int HelloTools::add(int a, int b){
   
    int c = 0;
    c = a+b;
    print(a , b);
    return c;
}

这是个HelloTools.cpp是我们前面介绍c++时用写的一个HelloTools类文件。里面主要有一个add的方法;如何导出这个库如何编译成一个web前端可调用的js库呢?

我们首先用emcc命令编译一下看看什么结果

# 注意,首次执行我们需要激活一下环境变量,找到emsdk的源码路径,进入emsdk目录,激活环境变量
source ./emsdk_env.sh
# 进入项目
cd 1.singleCPP
# 开始编译
emcc HelloTools.cpp -o HelloTools.js

编译成功,生成了HelloTools.jsHelloTools.wasm,如何检查编译的结果呢,我们继续

node环境下测试wasm

我们首先简单写一段测试test.js脚本

// test.js
var em_module = require('./HelloTools.js');
console.log(em_module);
var toolObj = new em_module();
var sum = toolObj.add(10,20);
console.log(sum);

使用node命令执行该js

node test.js

注意,需要安装好预先安装好nodejs

结果如下:

{
   
  inspect: [Function (anonymous)],
  FS_createDataFile: [Function: createDataFile],
  FS_createPreloadedFile: [Function: createPreloadedFile],
  ___wasm_call_ctors: [Function (anonymous)],
  ___errno_location: [Function (anonymous)],
  _fflush: [Function (anonymous)],
  _emscripten_stack_init: [Function (anonymous)],
  _emscripten_stack_get_free: [Function (anonymous)],
  _emscripten_stack_get_base: [Function (anonymous)],
  _emscripten_stack_get_end: [Function (anonymous)],
  stackSave: [Function (anonymous)],
  stackRestore: [Function (anonymous)],
  stackAlloc: [Function (anonymous)],
  dynCall_jiji: [Function (anonymous)]
}
/home/1.singleCPP/test-node/HelloTools.js:147
      throw ex;
      ^

TypeError: em_module is not a constructor
    at Object.<anonymous> (/home/1.singleCPP/test-node/test.js:3:15)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
    at internal/main/run_main_module.js:17:47

正常加载,但是后面无法创建实例,报了一堆错误,用法不对,这显然不是我们期待的;而前面打印的Module模块信息来看,视乎也没发现与我们HelloTools.cpp中类相关的任何标识。

浏览器中html测试wasm

为了方便调试测试,我们采用在chrome浏览器中进行测试(后续都在这个环境下测试讲解)。我们先创建一个html测试文件,html如下所示

<!
  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值