《一》˙转换

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

转载于:https://www.cnblogs.com/405845829qq/p/10342374.html

Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm...相关推荐

  1. Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm

    <一>˙转换 Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)的步骤: 最新版本的Em ...

  2. 批量 m3u8文件转成MP4的方法--Python实现和 cmd 实现(推荐cmd)--仅粉丝可见

    # 批量 m3u8文件转成MP4的方法 但是因为os.listdir()顺序的问题,此方法可能会导致乱序,所以推荐另外一种.  cmd部分引用链接:https://jingyan.baidu.com/ ...

  3. 怎样把mkv文件转成mp4?

    随着互联网的发展,视频文件已经更广泛的融入人们生活和工作的方方面面,甚至有很多小伙伴在视频剪辑行业开启了自己的行业之旅.但是大家在收集和下载视频的时候,就会发现各种格式的视频文件,其特点也是不一的,为 ...

  4. vs中将网站aspx.cs文件打包成一个dll

    vs中将网站aspx.cs文件打包成一个dll 23小时前 vs中将网站asp.net cs文件打包成一个dll. 在vs2008以上的版本中可以建立web应用来开发网站,这样网站aspx.cs文件[ ...

  5. 语音文件转成文字怎么转

    语音文件的话,很多时候都不是很方便,有时候我们在工作中就会碰到这样的难题,那就是把语音文件转成文字来使用,很多人遇到这样的问题就傻眼了,不知道该怎么转换,下面小编就将自己的方法介绍给大家吧. 使用工具 ...

  6. html文件 excel,怎么把html文件转成excel,excel表格代码

    如何将html里面的table导出成excel table2excel表格插件需要在页面中引入jqueryjquery.table2excel.js文件. HTML结构 你可以将任准的HTML表格结构 ...

  7. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  8. Java的jar文件安装成windows 服务

    Java的jar文件安装成windows 服务: 1.下载:nssm,复制到jar文件目录下 2. jar文件目录下创建bat文件[run.bat],内容为[java -jar 文件名.jar] 3. ...

  9. 使用sax将xml文件转成json

    SAX是解析XML文档是一种"基于事件的模型".基于SAX的解析器在处理文档时,会生成名为"事件"的通知信息.软件程序可"侦听"这些事件,以 ...

  10. py文件打包或apk_Python文件打包成exe很简单,如果安卓手机也能运行的软件你会吗...

    前言 我相信很多小伙伴都知道怎么将Python的文件打包成exe,而且这个也非常的简单,一行代码就能轻松搞定:pyinstaller -F xxx.py 但是如果我们用Python开发一个小游戏或者一 ...

最新文章

  1. 最新 macOS Sierra 10.12.3 安装CocoaPods及使用详解
  2. Xamarin XAML语言教程Xamarin.Forms中构建进度条
  3. php 其他格式数据与数组互转
  4. 一些常见去除恶意软件的东东
  5. python numpy库中省略号...的一些用法
  6. 教你如何用手机查看哪些人在蹭你家的WIFI,然后将他们屏蔽!
  7. 复盘Build 2016:不要错过微软给.NET开发者的这些福利
  8. java 批量打印_JAVA批量打印皕杰报表
  9. 结婚生娃和去核电站参观,哪个更安全?
  10. Very Deep Convolutional Networks for Large-scale Image Recognition(vggnet)
  11. Ajax get请求示例
  12. bmklocationmanager方法没有回调_SystemVerilog中的callback(回调)
  13. matlab 偏最小二乘回归,偏最小二乘法回归和判别分析的Matlab开源免费库
  14. 【计算机网络】知识梳理(二)物理层
  15. 【学习笔记】Docker基础实战教程一:入门
  16. 商务型网站建设多少钱
  17. 黑魂复刻游戏的碰撞摩擦问题——Unity随手记(2021.4.27)
  18. 消息队列Rabbitmq,在Node.js中的应用
  19. C#桌面程序设计复习
  20. Eclipse插件AngularJS Eclipse 1.2.0离线安装包

热门文章

  1. 凌恩客户文献|《ISME》解析土壤侵蚀对微生物群落结构以及网络功能复杂性影响
  2. 企业微信发送、撤回消息 java代码
  3. C# worksheet设置Excel样式(转载)
  4. 显卡优化以提高计算机性能,《绝地求生》完美显卡优化教程:低配电脑也能吃鸡无压力!...
  5. 建站影视cms网站源码(含安装说明文档)
  6. android 热修复阿里,Android热修复(阿里热修复)
  7. ITIL 4Foundation认证
  8. 负载均衡器 运行在2、3、4、7层之间的区别 [资料整理]
  9. 【DP】【Burnside】【多项式】烷基计数
  10. 进不去jetbrain官网怎么办