Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm
《一》˙转换
Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)的步骤:
最新版本的Emscripten(1.38.12)已经能实现把c/c++转成wasm文件,例子;
(1)源文件:extern.cc 如果不加extern “c”{}则转出的wasm文件对应的wast文件只有module这个词。
extern "C" {
int add(int x, int y) {
int a=333;
return x + y+ a;
}
int min(int x, int y) {
return x - y;
}
}
(2)转成wasm命令:
emcc extern.cc -o extern.js -s EXPORTED_FUNCTIONS='["_add","_min"]' -O3
注意:这里EXPORTED_FUNCTIONS指的是导出的函数,需要和源文件里的函数名是相对应的,-O3是编译优化等级,只有这个等级生成的wasm文件才会很小(几十字节),不加该优化选项,生成的wasm将会有几十KB。生成的时候会临时产生*.asm.js,等生成完后,会自动删掉。
执行完将会生成 extern.js和extern.wasm两个文件。
(3)转成wast可读文件:
wasm2wat extern.wasm -o extern.wast
wast文件内容:
(module
(type (;0;) (func (param i32 i32) (result i32)))
(func (;0;) (type 0) (param i32 i32) (result i32)
get_local 0
get_local 1
i32.sub)
(func (;1;) (type 0) (param i32 i32) (result i32)
get_local 0
i32.const 333
i32.add
get_local 1
i32.add)
(export "_add" (func 1))
(export "_min" (func 0)))
(4)转成llvm字节码 bc格式:
emcc extern.cc -o extern.bc -s EXPORTED_FUNCTIONS='["_add","_min"]' -O3
(5)使用llvm-dis把llvm字节码转成可读格式:
llvm-dis extern.bc
执行上述命令将生成extern.ll文件。
extern.ll 文件内容:
; ModuleID = 'extern.bc'
source_filename = "extern.cc"
target datalayout = "e-p:32:32-i64:64-v128:32:128-n32-S128"
target triple = "asmjs-unknown-emscripten"
; Function Attrs: norecurse nounwind readnone
define i32 @add(i32, i32) local_unnamed_addr #0 {
%3 = add i32 %0, 333
%4 = add i32 %3, %1
ret i32 %4
}
; Function Attrs: norecurse nounwind readnone
define i32 @min(i32, i32) local_unnamed_addr #0 {
%3 = sub nsw i32 %0, %1
ret i32 %3
}
attributes #0 = { norecurse nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 6.0.1 (emscripten 1.38.12 : 1.38.12)"}
最终生成的文件列表如下图:
《二》执行
Emscripten(1.38.12)执行把c/c++转成wasm文件的方法:
方法一:用node执行
源文件:extern-node.cc
#include <stdio.h>
#include <emscripten.h>
extern "C"{
void sayHi() {
printf("Hi!\n");
}
int daysInWeek() {
return 7;
}
}
编译命令:
emcc -s EXPORTED_FUNCTIONS="['_sayHi', '_daysInWeek']" extern-node.cc -o extern-node.js
编写node-test.js
var em_module = require('./extern-node.js');
em_module._sayHi();
em_module.ccall("sayHi");
console.log(em_module._daysInWeek());
执行:
Node node-test.js
方法二:用web服务器执行
源文件:extern.cc
#include <emscripten.h>
extern "C"{
int gol=1111;
int add(int x, int y) {
int a= 333;
//printf("hello world! %d\n",a);
return x + y+ a+gol;
}
int min(int x, int y) {
return x - y;
}
}
编译命令:
emcc extern.cc -s EXPORTED_FUNCTIONS="['_add']" -o extern.js
编写test.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<body>
<h1>Test File</h1>
<script type="text/javascript">
var Module = {
onRuntimeInitialized: function() {
var a=Module._add(1,2);
document.write("result == " + a);
}
};
</script>
<script type="text/javascript" src="extern.js"></script>
</body>
在当前目录使用serve运行 serve -l 8000 (如果没有serve,则执行npm install -g serve)
执行:在浏览器地址打开 localhost:8000/test
Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm相关推荐
- 批量 m3u8文件转成MP4的方法--Python实现和 cmd 实现(推荐cmd)--仅粉丝可见
# 批量 m3u8文件转成MP4的方法 但是因为os.listdir()顺序的问题,此方法可能会导致乱序,所以推荐另外一种. cmd部分引用链接:https://jingyan.baidu.com/ ...
- 怎样把mkv文件转成mp4?
随着互联网的发展,视频文件已经更广泛的融入人们生活和工作的方方面面,甚至有很多小伙伴在视频剪辑行业开启了自己的行业之旅.但是大家在收集和下载视频的时候,就会发现各种格式的视频文件,其特点也是不一的,为 ...
- vs中将网站aspx.cs文件打包成一个dll
vs中将网站aspx.cs文件打包成一个dll 23小时前 vs中将网站asp.net cs文件打包成一个dll. 在vs2008以上的版本中可以建立web应用来开发网站,这样网站aspx.cs文件[ ...
- 语音文件转成文字怎么转
语音文件的话,很多时候都不是很方便,有时候我们在工作中就会碰到这样的难题,那就是把语音文件转成文字来使用,很多人遇到这样的问题就傻眼了,不知道该怎么转换,下面小编就将自己的方法介绍给大家吧. 使用工具 ...
- html文件 excel,怎么把html文件转成excel,excel表格代码
如何将html里面的table导出成excel table2excel表格插件需要在页面中引入jqueryjquery.table2excel.js文件. HTML结构 你可以将任准的HTML表格结构 ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- Java的jar文件安装成windows 服务
Java的jar文件安装成windows 服务: 1.下载:nssm,复制到jar文件目录下 2. jar文件目录下创建bat文件[run.bat],内容为[java -jar 文件名.jar] 3. ...
- 使用sax将xml文件转成json
SAX是解析XML文档是一种"基于事件的模型".基于SAX的解析器在处理文档时,会生成名为"事件"的通知信息.软件程序可"侦听"这些事件,以 ...
- py文件打包或apk_Python文件打包成exe很简单,如果安卓手机也能运行的软件你会吗...
前言 我相信很多小伙伴都知道怎么将Python的文件打包成exe,而且这个也非常的简单,一行代码就能轻松搞定:pyinstaller -F xxx.py 但是如果我们用Python开发一个小游戏或者一 ...
最新文章
- 举例分析Linux动态库和静态库
- 教你29招,让你在社交,职场上人人对你刮目相看
- python由编译器将源程序转化为机器语言_python初识
- 编写一个Applet在屏幕上画一组同心圆
- 2022-03-13 转载 Dockerfile 高阶使用指南及镜像优化
- 让Latex支持中文
- Taro使用wxParse富文本组件
- 高频电子线路实验箱QY-JXSY25
- python爬虫设计实验
- 测试显卡专业性能软件,如何测试显卡的性能?几款的显卡性能检测软件推荐
- Redis设置过期时间
- 作为空降高管,应该要做好哪些准备?
- html5标签figure、figcaption
- 怎么在服务器里设置账号,云服务器怎么设置账号安全
- 企业数字化进程中,商业智能 BI 如何降本增效
- python学习笔记:插入函数append,extend与insert的使用与区别
- iOS 设备的屏幕尺寸
- 【写博客常用】sql server 登陆服务器名称是什么
- ci mysql操作_MySQL基础篇/第3篇:MySQL基本操作语句.md · icanci/MySQL-Review - Gitee.com...
- plink描述性统计--等位基因频率、缺失值
热门文章
- 前端微信公众号开发,CSS浮动的使用与清除
- Downloading https://ultralytics.com/assets/Arial.ttf to ...... yolov5报错解决
- noise variance and power of the Band-Limited White Noise in Simulink
- 警惕程序员的成长陷阱
- 开始一个新的地方作为自己技术的心灵园田,新浪微博太伤我心了
- [Qt]解决QPushButton的toggled无法触发setvisible
- java coalesce_java-具有休眠条件的COALESCE函数
- vue 左树右表增加左右拖拽的功能
- delphi的exports语句
- 模块化链传动的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告