织梦CMS - 轻松建站从此开始!

罗索

Emscripten将C++编译成LLVM位代码/wasm

jackyhwei 发布于 2021-06-17 10:13 点击:次 
大部分最新的浏览器均提供了WebAssembly虚拟机;然而WebAssembly代码并非只能在浏览器中运行,Node.js 8.0之后的版本也能运行WebAssembly;更进一步来说,WebAssembly虚拟机甚至可以脱离JavaScript环境支持
TAG: wasm  Emscripten  

一、 Emscripten

为了在浏览器中运行C/C++程序,从1995年起,许多知名项目相继开发。除尝试直接运行本地C++代码外,也有技术人员另辟蹊径,将其他语言直接转译为JavaScript后运行,Emscripten就是其中一个,它利用LLVM编译器前端编译C++代码,生成LLVM特有的跨平台中间语言代码,最终再将LLVM跨平台中间语言代码转译为JavaScript的子集WebAssembly。这样C/C++程序经过编译后不仅可在旧的JavaScript引擎上正确运行,同时也可以被优化为机器码之后高速运行。

二、 WebAssembly

WebAssembly是一种汇编语言,JavaScript代码运行在JavaScript虚拟机上,相对地,WebAssembly代码也运行在其特有的虚拟机上。大部分最新的浏览器均提供了WebAssembly虚拟机;然而WebAssembly代码并非只能在浏览器中运行,Node.js 8.0之后的版本也能运行WebAssembly;更进一步来说,WebAssembly虚拟机甚至可以脱离JavaScript环境支持。

WebAssembly程序从开发到运行于网页中大致可以分为以下几个阶段,如图1所示。

  1. 使用WebAssembly文本格式或其他语言(C++、Go、Rust等)编写程序,通过各自的工具链编译为WebAssembly汇编格式.wasm文件。
  2. 在网页中使用fetch(获取),XMLHttpRequest等获取.wasm文件。
  3. 将.wasm编译为模块,编译过程中进行合法性检查。
  4. 实例化。初始化导入对象,创建模块的实例。

执行实例的导出函数,完成所需操作。

总结:

  • Emscripten是一种编译工具;
  • WebAssembly是一种特有的汇编语言;
  • Emscripten可以将C++代码编译成WebAssembly汇编格式.wasm文件;

JS或者网页可以通过获取.wasm文件运行C++程序

三、安装

四、JS与C++交互方式

五、Emscripten139支持多线程版本编译C++常见问题

1. make.py网上版本

https://gitee.com/mirrors/h5rtmpclient/blob/master/make.py

编译脚本的相似版本,而发布时间是2016年,因此编译脚本相对比较老。

2. 链接错误,make error : unknown file type (Y)

https://webcache.googleusercontent.com/search?q=cache:2yeYc3Ygl9oJ:https://www.gitmemory.com/emscripten-core+&cd=8&hl=zh-CN&ct=clnk&gl=ug

JS播放库在emscipten139中,编译时出现 make error:unknown file type问题:编译命令格式尚未找到,有人提问但没有人解答。

https://emscripten.org/docs/compiling/WebAssembly.html

139后端wasm对链接具有不同功能集的文件非常严格,因此在138上可以链接的,在139出现的问题,且139不兼容138,底层依赖库需要重新编译

解决方案:在编译时加上

'-flto',

'-flto=full',

'-flto=thin',

3. 编译变慢 (Y)

https://emscripten.org/docs/getting_started/FAQ.html#why-is-code-compilation-slow

更新了后端,使编译变慢,但链接和运行更快

4. 在web主线程无法调用webAssembly代码(C++用emcc编译生成的js)

https://emscripten.org/docs/compiling/WebAssembly.html wasm文件编译

WebAssembly默认情况下是异步编译,这意味着您必须先等待编译完成,然后才能调用已编译的代码(通过等待main(),或onRuntimeInitialized回调等)。您可以通过设置来关闭异步编译WASM_ASYNC_COMPILATION=0,但是由于当前的限制,该设置可能无法在Chrome中运行。

关闭了异步编译,获取WebAssembly二进制文件也可能需要异步操作(因为Web不允许在主线程上下载同步二进制文件)。

5.解析库纯虚函数多个子类一起编译报错

解决办法:使用makefile脚本编译。

https://gitee.com/mirrors/h5rtmpclient/blob/master/make.py

当编译的cpp需要调用底层库(编译的BC库)的接口时,使用makefile编译。

若编译的cpp不需要底层库的接口时,可使用emcc aa.cpp bb.cpp –o aa.bc命令进行编译

(qq_34754747)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/202106/17837.html]
本文出处:CSDN博客 作者:qq_34754747 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
  • 上一篇:没有了
  • 下一篇:没有了
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片