emcc生成wasm,wast,bc文件的方法

2021-01-22 21:56:48

一、Emscripten编译优化分为两个步骤

  1. 每个源文件编译成目标文件(.bc文件),通过LLVM优化

  2. 目标文件编译成js文件

二、Js使用库的两种方式

1. 多个bitcode直接变成js

  • emcc project.bc libstuff.bc -o final.js

2. 多个bitcode先编译成一个,然后在变成js

  • emcc project.bc libstuff.bc -o allproject.bc

  • emcc allproject.bc -o final.js

一、Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)的步骤。

extern.cc文件

extern "C" {int add(int x, int y) {int a=333;return x + y+ a;}int min(int x, int y) {return x - y;}}

1.转成wasm命令

emcc extern.cc -o extern.js -s EXPORTED_FUNCTIONS='["_add","_min"]'  -O3 -s wasm=1

注意:这里EXPORTED_FUNCTIONS指的是导出的函数,需要和源文件里的函数名是相对应的,-O3是编译优化等级,只有这个等级生成的wasm文件才会很小(几十字节),不加该优化选项,生成的wasm将会有几十KB。生成的时候会临时产生*.asm.js,等生成完后,会自动删掉。

执行完将会生成 extern.js和extern.wasm两个文件。

2.转成wast可读文件

wasm2wat extern.wasm -o extern.wast

3.转成llvm字节码 bc格式(中间格式)

(开源编译器框架llvm字节介绍:http://www.nagain.com/activity/article/4/

 emcc extern.cc -o extern.bc -s EXPORTED_FUNCTIONS='["_add","_min"]'  -O3

4.使用llvm-dis把llvm字节码转成可读格式

 llvm-dis extern.bc

二、执行方式

1.使用服务器执行

https://blog.csdn.net/TurkeyCock/article/details/83317935

2.使用node执行

(1)编译.js文件

emcc extern.cc -o extern.js -s EXPORTED_FUNCTIONS='["_add","_min"]'

(2)编写test.js

var em_module = require('./extern.js');console.log("add:"+em_module._add(4,5));console.log("add:"+em_module._min(5,4));

(3)运行

Node node-test.js


  • 2019-09-03 23:09:17

    Linux下静态库(.a)和动态库(.so) 的生成与使用以及区别

    静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

  • 2019-09-03 23:19:12

    ./configure 的配置和用法

    Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。

  • 2019-09-04 16:24:17

    Ubuntu apt-get更换为阿里源

    ​进入阿里巴巴开源镜像页面,找到ubuntu,点击后面的帮助,可以看到类似下面的介绍,加入就好。切记下面的第三步。

  • 2019-09-04 16:32:56

    Ubuntu tar 解压缩命令详解

    tar 解压缩命令详解,这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

  • 2019-09-04 16:50:35

    CMake入门笔记

    Make是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

  • 2019-09-05 20:51:15

    在Android上使用FFmpeg压缩视频

    libavcodec-提供了更加全面的编解码实现的合集 libavformat-提供了更加全面的音视频容器格式的封装和解析以及所支持的协议 libavutil-提供了一些公共函数 libavfilter-提供音视频的过滤器,如视频加水印、音频变声等 libavdevice-提供支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制 libswresample,libavresample-提供音频的重采样工具 libswscale-提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的YUV转换 libpostproc-多媒体后处理器

  • 2019-09-05 20:54:21

    在Android 中使用FFmpeg命令

    到这里就可以运行FFmpeg命令了。一直我也是这样使用,但是我在做这个项目Cut的时候发现连续调用多次FFmpeg命令会报错(在项目需要,先改变分镜头的速度,再合成视频)。 为什么会这样的呢?