LLVM 在10之后都支持了wasm,但是这是一个实验性的功能,默认是不打开的,另外,在windows上,llvm是不带LLVM静态编译器的,也就是llc,但是Linux倒是自带了llvm的llc,但是编译成wasm也是不会默认开启的。这需要我们自己去手动开启。何谓手动开启,那当然是你自己编译一遍了.

编译完成后,才能尝鲜.

推荐在电脑查看此文章

(本文假设你的机子上装好了msys64 或者是MINGW,python或者Anaconda)

第一步:下载LLVM源码
LLVM的源码你可以在github的LLVM镜像仓库找到,又或者你可以在国内的码云上下载,对于国内用户来说gitee是比较快的。还有一种方式,那就是到官网上下载。

github mirror: https://github.com/llvm/llvm-project.git

gitee mirror: https://gitee.com/mirrors/LLVM

我们需要编译的是llvm源码下的llvm文件夹中的源码,所以需要把llvm的源码下下来。

图中所指的文件夹下的源码就是我们需要的
或者你可以在LLVM的官网去下载打包好的源码

箭头指向的链接就是我们需要的源码
https://clang.llvm.org/get_started.html,这里也有相关项目编译的教程

然后就可以开始编译了。

第二步,编译LLVM
LLVM使用的构建工具是cmake,所以只需要一些简单的构建命令就行了

比如cmake常用的

mkdir build && cd build && cmake ../

但是,这次我们构建有点不一样,我们需要给cmake一些参数,其中关键的就是

--DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly

编译的命令如下


实际的编译命令
@set "SOURCE_DIR=%~dp0..\llvm"

@set "CLANG=clang"

@set "gcC_C_COMPILER=gcc.exe"

@set "gcC_CXX_COMPILER=g++.exe"

@set "C_COMPILER=E:\Programming\msys64\mingw64\bin\%CLANG%.exe"

@set "CXX_COMPILER=E:\Programming\msys64\mingw64\bin\%CLANG%++.exe"

@set "BUILD_TYPE=Release"

@set "BUILD_EXPORT_COMMANDS=TRUE"

@set "GENERATER_STYLE=Unix Makefiles"

@set "TARGETS_TO_BUILD=WebAssembly"

@cmake -S=%SOURCE_DIR% -DCMAKE_EXPORT_COMPILE_COMMANDS=%BUILD_EXPORT_COMMANDS% --DCMAKE_C_COMPILER=%C_COMPILER% -DCMAKE_CXX_COMPILER=%CXX_COMPILER% --DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=%TARGETS_TO_BUILD% ../llvm

这个是bat(批处理文件)用来编译的命令 两个百分号之间的是定义好的变量,set 命令是在申明变量 @是表示当前的这个命令不在控制台显示

@set "BUILD_TYPE=Release" 此条命令就是定义了一个名叫BUILD_TYPE的变量,它的值是Release

我比较推荐使用vscode进行编译,界面化,而且门槛比较低

使用VSCODE编译
如果你的电脑装好了vscode,并且安装了cmake插件的话,你可以直接在配置里面添加这个参数


打开配置项

选择配置过程中传递给cmake的参数
参数也就是我上面说过的 --DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly

把颜色标出的这段参数拷贝后选择添加项,复制到那个输入框中,确认就行了。

然后就是等待编译完成了。

在编译完成后把llc添加到环境变量当中,完成后在终端(cmd或是其他命令行工具)输入llc --version 将会出现以下信息

LLVM (http://llvm.org/):
  LLVM version 11.0.0
  Optimized build with assertions.
  Default target: x86_64-w64-windows-gnu
  Host CPU: skylake

Registered Targets:
    aarch64    - AArch64 (little endian)
    aarch64_32 - AArch64 (little endian ILP32)
    aarch64_be - AArch64 (big endian)
    amdgcn     - AMD gcN GPUs
    arm        - ARM
    arm64      - ARM64 (little endian)
    arm64_32   - ARM64 (little endian ILP32)
    armeb      - ARM (big endian)
    avr        - Atmel AVR Microcontroller
    bpf        - BPF (host endian)
    bpfeb      - BPF (big endian)
    bpfel      - BPF (little endian)
    hexagon    - Hexagon
    lanai      - Lanai
    mips       - MIPS (32-bit big endian)
    mips64     - MIPS (64-bit big endian)
    mips64el   - MIPS (64-bit little endian)
    mipsel     - MIPS (32-bit little endian)
    msp430     - MSP430 [experimental]
    nvptx      - NVIDIA PTX 32-bit
    nvptx64    - NVIDIA PTX 64-bit
    ppc32      - PowerPC 32
    ppc64      - PowerPC 64
    ppc64le    - PowerPC 64 LE
    r600       - AMD GPUs HD2XXX-HD6XXX
    risCV32    - 32-bit RISC-V
    risCV64    - 64-bit RISC-V
    sparc      - Sparc
    sparcel    - Sparc LE
    sparCV9    - Sparc V9
    systemz    - SystemZ
    thumb      - Thumb
    thumbeb    - Thumb (big endian)
    wasm32     - WebAssembly 32-bit
    wasm64     - WebAssembly 64-bit
    x86        - 32-bit X86: Pentium-Pro and above
    x86-64     - 64-bit X86: EM64T and AMD64
    xcore      - XCore

这当中的wasm32和wasm64就是我们需要的了

测试部分
然后创建一个测试的项目看看是否工作正常

这个是我创建的一个wasm测试的项目
创建build文件夹,如果没有的话,进入build文件夹后执行命令如下

clang -c -O3 --target=wasm32 ..\src\hello_wasm.c

wasm-ld --no-entry --strip-all --allow-undefined --export-all hello_wasm.o -o hello_wasm.wasm

然后就会在控制台看到WebAssemblyScript,你可以把这些代码拷贝下来复制到一个文件里保存起来。

很多Up主有时候根本察觉不到的一个视频投稿功能就使用了这个技术。用于将视频进行解码的一个有名的开源库FFmpeg,就有wasm版本的,使得我们在浏览器里面也能快速对视频音频进行解码。而B站使用正是这个库。

想要验证B站是否是真的使用wasm,可以把浏览器用F12或者Ctrl+Shift+I打开调式工具,然后点击调试器(火狐里的) 或者Source(谷歌浏览器里的),你会看到一个wasm的东西,那就是能够确认这个网站或者说这个网页使用了wasm这个技术。

如何使用LLVM将C语言编译为WASM相关推荐

  1. Clang:LLVM 的 C 语言家族前端

    Clang:LLVM 的 C 语言家族前端 Clang 项目为LLVM 项目的 C 语言家族(C.C++.Objective C/C++.OpenCL.CUDA 和 RenderScript)中,提供 ...

  2. Clang:LLVM的C语言家族前端

    Clang:LLVM的C语言家族前端 Clang项目为LLVM 项目的C语言家族(C,C ++,Objective C / C ++,OpenCL,CUDA和RenderScript)中的语言提供了语 ...

  3. c语言编译的四个阶段

    总结:(源文件名为loops.c) 可以转换到不同阶段.阶段1,将头文件加进来.阶段2,转换成汇编程序,与机器类型相关.阶段3,转换成机器码,但不完整.阶段4,链接其他系统文件,形成最终可执行文件 c ...

  4. C语言编译全过程(转贴)

    C语言编译全过程 编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成 ...

  5. 【转载】C语言编译全过程

             今天在blog.chinaunix.net/u3博客看到一篇关于语言编译过程的文章,觉得精简,清晰所以摘录下来我的blog.作为一个程序员了解编译过程对程序的编写也很有帮助.下面是博 ...

  6. 以Linux系统上的gcc为例,解密C语言编译背后的全过程!

    在这个互联网时代,很多人都选择了计算机专业,而只要是计算机专业的小伙伴,可能都会学C语言,但是大家是否都清楚C语言编译的完整过程呢,今天我就带着大家一起来做个解密吧. C语言相对于汇编语言是一种高级语 ...

  7. 2.c语言编译预处理,c语言第03章-编译预处理2.ppt

    c语言第03章-编译预处理2 第3章 编译预处理 编译预处理是指,编译时,首先对编译预处理命令进行处理,然后再将预处理后的中间结果进行编译,以得到目标代码. 教学目的: 掌握#define.#incl ...

  8. c语言将源文件拷贝到目的文件,C语言编译过程 简介和详解

    C编译的整个过程很复杂,大致可以分为以下四个阶段: 1)预处理阶段在该阶段主要完成对源代码的预处理工作,主要包括对宏定义指令,头文件包含指令,预定义指令和特殊字符的处理,如对宏定义的替换以及文件头中所 ...

  9. C语言编译、链接过程探究

    编译器基本构成: C语言编译基本流程图解: 预处理: 处理所有的注释,以空格代替 将所有的#define删除,并且展开左右的宏定义 处理条件编译指令#if,#ifdef ,#elif,#else , ...

最新文章

  1. 计算机辅助测试英语缩写,“CAT”是“Computer-Aided Testing”的缩写,意思是“计算机辅助测试”...
  2. android获取文件上级目录,Android 文件存储
  3. [无向图割点] PKU 1523 SPF
  4. mysql重启root不能登_Mysql 5.7.28初始化使用root无法登录
  5. linux time
  6. Unicode16 与 UTF-8编码之间的转换
  7. VSCode在文件顶部添加作者,时间和注释等信息
  8. Google Colab使用笔记
  9. 极路由1S HC5661A 刷入不死u-boot(breed)加刷潘多拉固件教程
  10. MySQL 根据身份证查找年龄段
  11. 西部世界分析:人民网点名IPFS 分布式存储打开千亿级市场
  12. 让你相见恨晚的PS技巧分享
  13. 人工智能如何改善运输和物流
  14. 服饰美妆新品 | 阿迪达斯可循环跑鞋第三代LOOP系列发布;赫丽尔斯X吃豆人跨界限定系列推出...
  15. Python里如何判断闰年
  16. java date 操作_java日期操作-java Date-java Calendar-嗨客网
  17. 软银巨资收购ARM:这是场天作之合?
  18. 前端基础(二):CSS
  19. 企业微信的「举足轻重」
  20. 高数篇(四)-- 互信息概述与matlab实现

热门文章

  1. 无root权限远程安装matlab
  2. C语言读3D数据.raw文件
  3. 手机里面的图片删掉了怎么找回来的超全面解决方法
  4. luoguP4343自动刷题机
  5. TDOA_工作流名称、流程表单办理等页面生僻字无法显示
  6. day1 关于打印机后台任务无法删除如何解决
  7. 仿饿了么,百度外卖这些App的双ListView列表联动效果
  8. 云计算学习素材框架,msyql查询操作课件
  9. 介绍一个实现ssh-2协议的java库:Ganymed SSH-2 for Java
  10. java ssh2 jar_java使用ganymed-ssh2执行linux命令