开发者指导

本页面提供一步一步的操作将一个简单的程序编译成webassembly

前提要求

为了编译成webAssembly,需要提前安装一些工具:

  • Git。在Linux和OSX下已自带了Git,在Windows下需要安装 Git for Windows
  • CMake。在Linux和OSX下可以使用像apt-get 或 brew 这样的包管理工具来安装,在Windows下下载CMake installer;
  • 编译工具。 在linux下安装GCC,在OSX下安装Xcode。在Windows下安装 Visual Studio 2015 Community with Update 3 或更新的版本;
  • Python2.7.x。在Linux和OSX下大部分都内置了Python2.7版本,没有的需要安装,Windows下需要自动下载安装;

安装完后,确保git,cmake,python可访问(否则手动添加环境变量);从技术上讲,如果使用提前编译好的工具链,那么CMake和编译工具不是必须的,只是开发选项可能受到一点限制。

下载或编译工具链

在GitHub行容易获得一个提前编译好的工具链,用以将c/c++编译d为webAssembly

$ git clone https://github.com/juj/emsdk.git
$ cd emsdk
$ ./emsdk install latest
$ ./emsdk activate latest

如果你在Linux发布版本的操作系统里无法获得预编译的Emscripten 工具链,或者你想从源码构建所有工具链,Emscripten SDK 也能用来构建。它的操作步骤如下:

$ git clone https://github.com/juj/emsdk.git
$ cd emsdk
$ ./emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit
$ ./emsdk activate --build=Release sdk-incoming-64bit binaryen-master-64bit

经过h这些步骤后,安装已经完成了。在下载完预编译工具链或者你自己构建完成后,将Emscripten编译环境添加到当前shell环境中,输入:

$ source ./emsdk_env.sh --build=Release

此条命令添加相关的环境变量和目录到PATH中,使得当前终端很容易的找到编译工具。

在Windows下 把上面所有命令中的 ./emsdk替换为 emsdksource ./emsdk_env.sh替换为 emsdk_env

如果你是使用 Visual Studio 2017 ,在emsdk install命令后面添加一个参数 --vs2017

编译执行一个简单的程序

现在有一个完整的工具链来编译简单的程序为webAssembly。但是下面还有几个说明:

  • 需要使用emcc-s WASM=1选项。否则emcc默认编译为asm.js;
  • 如果要使Emscripten生成除了Wasm二进制文件和JavaScript包装文件外的可执行HTML文件,需要指定一个以 .html结尾的输出文件;
  • 最后,不能在浏览器里通过file://协议简单的打开HTML文件,因为在file协议里跨源请求时不被允许的,需要通过一个http服务来打开文件。

下面的命令创建和编译一个简单的“hello world”程序:

$ mkdir hello
$ cd hello
$ touch hello.c
$ echo '#include <stdio.h> int main(int argc, char ** argv) { printf("Hello world!");}' > hello.c
$ emcc hello.c -s WASM=1 -o hello.html

可以g通过Emscript SDK的 emrun来提供一个http服务:

$ emrun --no_browser --port 8000 ./

当http服务运行起来,可以从浏览器打开,地址为: http://localhost:8000/hello.html,如果你在Emscripten 控制台看到“Hello world!”,那么恭喜你已经成功的编译webAssembly!

一点思考

对于办公来说,首选的时Windows或OSX,但OSX太贵了,所以Windows用的还是挺多的,我遇到好多的工具在Windows下的使用都依赖Visual Studio,但是Visual Studio实在是太笨重了,我特别厌恶,之后遇到了WSL 即Windows子系统,在里面可以安装好几种Linux系统,用起来特别流畅,比虚拟机好用多了,我觉得这个微软的这个功能特别赞。

WebAssembly文件加载常会碰都WebAssembly因为MIME 不是 wasm类型而无法编译问题,可以查看自己的服务器软件里有么有 Application/wasm类型。

nginx配置 MIME类型

找到nginx的配置文件所在目录,我的在/etc/nginx/下,里面有个mime.types文件,为了不弄乱排序结构,找到 application/v**** 和 application/x****的配置项中间加一行 application/wasm wasm;,保存后重启nginx systemctl restart nginx

// 配置后的一部分内容
..................
application/vnd.google-earth.kmz kmz;
application/wasm wasm;
application/x-7z-compressed 7z;
....................

使用 curl -I url查看服务器响应的头部信息。

WebAssembly简单指导---译的更多相关文章

  1. REST API设计指导——译自Microsoft REST API Guidelines(四)

    前言 前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整 ...

  2. REST API设计指导——译自Microsoft REST API Guidelines(二)

    由于文章内容较长,只能拆开发布.翻译的不对之处,请多多指教. 另外:最近团队在做一些技术何架构的研究,视频教程只能争取周末多录制一点,同时预计在下周我们会展开一次直播活动,内容围绕容器技术这块. 所有 ...

  3. 开发Angular库的简单指导(译)

    1. 最近工作上用到Angular,需要查阅一些英文资料,虽然英文非常烂,但是种种原因又不得不硬着头皮上,只是每次看英文都很费力,因此决定将一些比较重要的特别是需要反复阅读的资料翻译一下,以节约再次阅 ...

  4. REST API设计指导——译自Microsoft REST API Guidelines(一)

    前言 前面我们说了,有章可循,有据可依,有正确的产品流程和规范,我们的工作才不至于产生混乱,团队的工作才能更有成效.我们经常见到,程序开发可能只用了半个月,但是接口的联调却经常需要花费半个月甚至一个月 ...

  5. REST API设计指导——译自Microsoft REST API Guidelines(三)

    前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整完善实 ...

  6. 基于LoadRunner11,以wifi热点方式录制APP脚本简单指导

    本想详细写下操作过程,但并不觉着十分必要,通过baidu或我要自学网均能找到相关资料,所以详细操作过程不再赘述,只是把过程中遇到的问题说明下解释下,让大家“录制APP”的路更平坦! 1.如何使用Loa ...

  7. Moco使用简单指导

    下载地址 需要java运行环境支持.下载jar包:moco-runner-<version>-standalone.jar 配置文件 下面是参考: 配置 Moco的配置文件格式使用的是js ...

  8. Vim插件:Unite新手指导(译)

    Unite是什么? Unite可以在一个项目中快速浏览文件.但是它不仅限于文件,其他任何可以列出的东西都可以很好的被显示和搜索.这个开放式的特性很可能是人们找到它的原因(原文:This open-en ...

  9. .NET开发者如何愉快的进行微信公众号开发

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这篇文章只是一个如何提高开发效率的简单指导和记录,不会涉及具体的微信公众号开发内容. ...

随机推荐

  1. 团队内的沟通方式:网络 OR 当面

    4月1日,我和老王稍微聊了聊关于互联网的工作方式,团队的成员不在一个地方,通过远程互联网的方式进行沟通是不是OK.现在确实有很多公司是有多地的分公司,子公司,不同的团队在不同的办公室中,甚至一个大团队 ...

  2. this指针------新标准c++程序设计

    背景:   c++是在c语言的基础上发展而来的,第一个c++的编译器实际上是将c++程序翻译成c语言程序,然后再用c语言编译器进行编译.c语言没有类的概念,只有结构,函数都是全局函数,没有成员函数.翻 ...

  3. 使用memcache 存储session

    session.save_handler = memcache //设置session的储存方式为memcache memcache.hash_strategy = "consistent& ...

  4. 入参为json类型的接口测试示例

    一.接口文档内容 二.使用postman(入参为json类型) 如下部分内容即是json串: { "name":"刘星", "grade": ...

  5. 【转】c#中@的3种作用

    源地址:https://www.cnblogs.com/linkbiz/p/6380814.html

  6. JavaWeb应用中初始化Log4j的两种方式

    本文主要介绍了普通JavaWeb应用(基于Tomcat)中初始化Log4j的两种方式: 1.通过增加 InitServlet ,设置令其自启动来初始化 Log4j . 2.通过监听器 ServletC ...

  7. jquery查找子元素和兄弟元素

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. [洛谷 P4612][COCI 2011-2012#7] Setnja

    传送门 TM :setnja (1S256M) 一个人要散步去会见他的 N 个朋友(按给定的顺序会见).我们可以理解成他们都住在一个 很大的网格内,每个朋友住其中的一个单元格,所有人每一步都可以走到相 ...

  9. ES6问题记录--Promise

    在读[阮一峰]的 ES6 入门文档的时候,有一段代码是这样的. 文章中,还有一段是这样写的 所以,Promise.resolve(3).finally(()=>{}),解析出来的resolve ...

  10. oracle数据库操纵语言DML

    oracle数据库操纵语言:DML 添加数据: ()直接添加数据: insert into table_name(column_name1,column_name2,...) values(data1 ...