一、 Emscripten为了在浏览器中运行C/C++程序,从1995年起,许多知名项目相继开发。除尝试直接运行本地C++代码外,也有技术人员另辟蹊径,将其他语言直接转译为JavaScript后运行,Emscripten就是其中一个,它利用LLVM编译器前端编译C++代码,生成LLVM特有的跨平台中间语言代码,最终再将LLVM跨平台中间语言代码转译为JavaScript的子集WebAssembly。这样C/C++程序经过编译后不仅可在旧的JavaScript引擎上正确运行,同时也可以被优化为机器码之后高速运行。 二、 WebAssemblyWebAssembly是一种汇编语言,JavaScript代码运行在JavaScript虚拟机上,相对地,WebAssembly代码也运行在其特有的虚拟机上。大部分最新的浏览器均提供了WebAssembly虚拟机;然而WebAssembly代码并非只能在浏览器中运行,Node.js 8.0之后的版本也能运行WebAssembly;更进一步来说,WebAssembly虚拟机甚至可以脱离JavaScript环境支持。 WebAssembly程序从开发到运行于网页中大致可以分为以下几个阶段,如图1所示。
执行实例的导出函数,完成所需操作。 总结:
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)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) |