《一》˙转换

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的更多相关文章

  1. mpp文件转换成jpg图片,可以用pdf文件做中转站

    用project软件做了一个表,发现不能转换成图片,先把mpp文件转换成pdf文件,然后用PS打开pdf文件,存储为jpg格式就行了

  2. less文件编译成微信小程序wxss文件

    2016年9月21日,微信小程序正式开启内测.在微信生态下,触手可及.用完即走的微信小程序引起广泛关注,刷爆朋友圈子.在这样的火爆氛围中,作为一个前端开发者的我,也悄悄地去尝鲜.在做demo小示例的过 ...

  3. SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable

    MS SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表可以在不同服务器上). SqlBulkCopy 类允许编写提供类似功能的托管代码解决方 ...

  4. [python]自动化将markdown文件转成html文件

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. Android中将布局文件转成bitmap

    在实践中发现,有些需要打印的小票高度小于屏幕的高度,而有些小票内容过多高度高于屏幕高度. 小于屏幕高度的布局文件转成bitmap较为容易,高于屏幕高度的布局文件转成长图bitmap较为复杂. 一.小于 ...

  6. php将文件转换成二进制输出[转]

    header( "Content-type: image/jpeg"); $PSize = filesize('1.jpg'); $picturedata = fread(fope ...

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

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

  8. 使用宏批量将多个csv文件转成excel文件

    在一个压缩文件中有100多个csv文件,要求要将此100多个csv文件转成excel文件,名字命名不变,有三种方式: 1. 傻不拉几的复制粘贴法 2. 一个一个打开csv文件,另存为xls文件,工作量 ...

  9. ocx文件转换成C#程序引用的DLL

    将ocx文件转换成C#程序引用的DLL文件的办法  将ocx文件转换成C#程序引用的DLL文件的办法,需要的朋友可以参考一下  1.打开VS2008或VS2010命令提示符(此例用VS2008) 将o ...

随机推荐

  1. 51 NOD 1407 and and and and !!

    首先与等于零   相当于要求 每一位 在选的数里都有至少一个在该位为 0.直接求这个不太好求,我们考虑容斥: 设F(s) 为 不合法的位的集合至少是s的方案数 ,某一位不合法当且仅当选的数在这一位都是 ...

  2. PyTorch学习问题记录

    Q1:def train() 中的model.train()的作用是什么?为什么要写? A1:class torch.nn.Module中 train(mode=True) Sets the modu ...

  3. mysql数据库连接状态,不要做修改数据库表结构的操作;数据库迁移操作;

    在开发过程中,python的flask框架使用sqlalmysql连接mysql数据库. 在程序连接数据量过程中,不要修改数据表的结构.比如在连接状态中使用下面的软件修改数据表结构,这个软件立即就会卡 ...

  4. jmeter源码编译

    转载:http://blog.csdn.net/wanglha/article/details/42004943 一.下载源码 git clone git://github.com/apache/jm ...

  5. Azure Mobile App - Custom Authentication

    Custom Authentication: 1. For OLD Mobile Service - https://azure.microsoft.com/en-us/documentation/a ...

  6. JavaScript插件编写指南

    在编写插件之前,大家要先了解做插件的几个要点: 插件需要满足的条件 一个可复用的插件需要满足以下条件: 插件自身的作用域与用户当前的作用域相互独立,也就是插件内部的私有变量不能影响使用者的环境变量: ...

  7. libpcre.so.0 被删除怎么办?

    删除  #rpm -e --nodeps pcre-6.6-1.1 1> wget   http://mirror.centos.org/centos/6/os/i386/Packages/pc ...

  8. hadoop集群ambari搭建(2)之制作hadoop本地源

    准备好源资源server,我使用之前的一台node4,配置都是1GB内存20GB存储 集群最好的安装方式一定是通过本地源的,假设是公共源,那么网络将会严重影响我们的安装进度.所以制作本地源是每个大数据 ...

  9. YAML 对中文的处理

    from yaml import load,dump f = open('xx.ymal',encoding='utf-8') l = load(f) print(f) w = open('xx_co ...

  10. About me --- Connecting the dots

    在这个难以入眠的夜里,乔布斯年在斯坦福的演讲里说的“Connecting the dots”又萦绕耳际,即当我们往回看,就清楚了 自己曾经的生活和现在甚至将来是串联在一起的,这些经历决定了我们事业.生 ...