JS调用C的填坑之路,通过WebAssembly

JS如何调用C函数接口(文章中的图片不知道为何无法拷贝,不过都是些错误提示,影响不大,所有有部分图片没有上传)

 

参考案例1:https://blog.csdn.net/pkx1993/article/details/79550180(代码有点小问题,有部分参考价值)

 

这里涉及到Emscripten和WebAssembly技术,首先我们来了解一下什么是WebAssembly。

WebAssembly是一种小体积,高加载速度的二进制编码格式。从名字就能知道,这是一门底层汇编级的语言。有了WebAssembly,我们的虚拟机层就将会同时加载和运行两种类型的代码——JavaScript和WebAssembly。这两种代码可以通过WebAssembly所提供的js api实现互相调用。事实上,WebAssembly代码的基本单元被称作一个模块,并且这个模块在很多方面都和ES2015的模块是等价的。所以我们可以认为WebAssembly模块是一个“高性能的JS函数”。WebAssembly不是用来取代JavaScript的。它被设计为和JavaScript一起协同工作,从而使得网络开发者能够利用两种语言的优势。WebAssembly设计的目的不是为了手写汇编级别代码,而是为诸如C、C++等低级源语言提供一个高效的编译目标,使得以各种语言编写的代码都可以以接近原生的速度在web中运行。这一点具有重大的意义,这意味着所有由传统语言编写的客户端app都可以在web上高效运行,也就是说在未来客户端全面web化,未来可能不再需要客户端app 。(更多详细参考:https://blog.csdn.net/m549393829/article/details/81839822

Emscripten是c文件的编译环境,可以将C文件编译成JS可用的wasm文件,wasm文件,顾名思义,web-asm,就相当于web界的汇编。

安装Emscripten有很多坑,分为Linux版本和Windows版本,目前我试安装了Linux版本,在付出了把218.77服务器系统搞崩的代价之后,重装系统继续填坑终于安装好(BUT执行不了???泪奔!!!(╥╯^╰╥)),以下是具体的填坑过程。

 

不建议按官网的步骤来,因为有些依赖需要先安装,官网是写在后面的,而且官网是全英文的,英语不好的不建议看。

1、安装依赖工具,有几百兆,需要几分钟

apt-get update

apt-get install openssh-server git curl wget tar unzip

apt-get install build-essential python cmake default-jre

2、进自己准备安装的目录,从github拷贝源(自动创建emsdk文件夹):

git clone https://github.com/juj/emsdk.git

3、更新一下,git pull

4、安装最新的SDK及一些关键的工具

安装时会自动检查并下载缺失的llvm(体积很大)、clang、node、emscripten和sdk

执行 ./emsdk install latest

这里自动下载必定失败(图2),每次执行失败后会提供一条url,将Url复制到浏览器手动下载,将所有工具下载完成后在emsdk目录下创建目录zips,然后将工具拷贝到里面,然后再执行./emsdk install latest , 完成。

相关的需要下载的依赖软件我放在218.77/share/download/zips/目录下,有个4个安装包,图1.JS调用C的填坑之路,通过WebAssembly_第1张图片

 

5、配置 ./emsdk activate latest

6、安装binaryen ./emsdk install binaryen-tag-1.38.4-64bit 步骤同上,手动下载安装并配置./emsdk activate binaryen-tag-1.38.4-64bit

但这里服务器环境是ubuntu12.04,gcc版本4.6,安装binaryen-tag-1.38.4-64bit编译报错,gcc/g++版本过低,图3JS调用C的填坑之路,通过WebAssembly_第2张图片

 

无法识别’-std=c++11’,于是又安装了4.8版本,具体步骤如下:

6.1首先添加源,默认的源是没有的,更新也没用。

add-apt-repository ppa:ubuntu-toolchain-r/test; apt-get update;

6.2下载安装gcc和g++ 4.8版本

apt-get install gcc-4.8 g++-4.8

 

6.3查看一下 ls -lh /usr/bin/g++*

6.4切换版本

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8

sudo update-alternatives --config gcc

4

6.5完成之后再执行一遍,OK了

6.6 查看已安装列表 ./emsdk list,对安装没有影响,只是查看

7、配置环境 source ./emsdk_env.sh

终于到最后一步了,执行emcc --version查看一下版本。然鹅。。。。。。我太天真了

5

Emcc命令未找到????What’s the f***?我满头问号,于是我又将上面的命令重新执行了一遍(后面我想了下,可能是binaryen在环境配置之后),然后终于

6

7

终于。。。。

8

 

8、测试编译.c文件,然后我兴高采烈地准备编译一个test.c,然鹅。。。。。。我又太天真了???What’s the f***?

运行错误:JS调用C的填坑之路,通过WebAssembly_第3张图片

9

上面的英文我大致看了下,可能是某些工具版本的问题。于是我又跑到阿里云服务器ubuntu14.04版本将emcc环境安装了一遍,然后。。。。。。真的可以了

10

9、接下来就是JS验证测试了,按照开头的案例测试一下。

Copy过来测试发现有代码有问题,继续百度发现了一个更好的案例:

http://www.cnblogs.com/woodzcl/p/7478792.html 这个案例里有在windows下面安装编译环境的步骤(其实也和linux类似,只是命令和方法不同)

后来搜索webassembly提供了在线调试工具:https://webassembly.studio/ ,https://wasdk.github.io/WasmFiddle/这个就非常方便了。JS调用C的填坑之路,通过WebAssembly_第4张图片

11

测试OK,下载源码包,图11。需要注意的是,浏览器需要支持webassembly。然后,有问题找百度,百度能找到很多相关的资料。

10、参考资料

除上述提到的url资料链接,还有以下资料参考:

  1. https://blog.csdn.net/m549393829/article/details/81839822
  2. https://www.jianshu.com/p/bff8aa23fe4d
  3. https://www.aliyun.com/jiaocheng/990527.html

 

未完待续。。。

2018-11-23

你可能感兴趣的:(web)