文章目录
ubuntu20.04 安装clang
前置基础
编译器是一种计算机程序,它将某种编程语言(高级编程语言)写成的源代码转换成另一种编程语言(低级编程语言)。一个现代编译器的主要工作流程为:源代码->预处理器->编译器->目标代码->链接器->可执行程序,最后打包文件,让计算机运行。编译器的目的是将便于人写的高级编程语言作为源代码,翻译成计算机能够执行的低级机器语言,也就是可执行文件。其中高级语言有C、C++、Java、Python等,低级语言有汇编语言和机器代码。一个编译器可以按照三段式分为:前段(Fontend)、优化器(Optimizer)、后端(Backend)。
什么是clang
CLang是一个由C++编写的编译器前端,能够编译C/C++/Objective等高级语言,属于LLVM的一部分,发布于BSD(自由软件中使用最广发的许可证之一)许可证下,其目的就是为了超越GCC。经过测试证明,Clang编译Objective-C代码的速度为GCC的3倍左右,同时它还能针对用户发生的编译错误准确地给出建议。
Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器。
什么是LLVM以及其和clang的关系
官网:https://llvm.org/
LLVM最初是伊利诺伊大学的一个研究项目,目的是提供一种基于SSA的现代编译策略,该策略能够支持任意编程语言的静态和动态编译。从那时起,LLVM逐渐发展成为一个由多个子项目组成的总体项目,其中许多子项目已用于各种商业和开源项目的产品中,并广泛用于学术研究。
clang是LLVM架构下的一个子项目,是C/C++/Obj C语言的编译器前端,该项目的源码和LLVM是分开放置的。
LLVM最开始是被当做虚拟机来开发的,名字全程是Low Level VIsual Machine;不过开发之后,从来都没有被当做虚拟机来使用,但是由于名字已经叫开了,作者就决定以LLVM作为该项目的全程来使用了。
LLVM目前是种编译器框架系统的名字,该系统以C++编写完成,整个框架包括前端、优化器和后端三个部分;同时也有一个狭义的LLVM,认为LLVM只是LLVM架构的后端。
LLVM将传统的编译过程拆分成了前端、优化器和后端三个部分,其中前端是预处理、词法分析、语法分析、生成抽象语法树(AST)和产生中间表示(IR)的过程,后端是根据中间表示(IR)生成最终目标平台的机器语言的过程,中间优化器则是对IR进行优化处理的过程。
**这样做的好处是可以对编译过程进行解耦,当增加对一门语言的支持时,只需要增加一个前端(FrontEnd);当需要增加一个编译的目标平台时,则只需要增加一个后(BackEnd);**优化器无关乎语言和平台,只在中间表示(IR)的层面上进行。
宏观的LLVM,指的是整个的LLVM的框架,它肯定包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端。虽然这个前端占的比重比较大,但是它依然只是个前端,LLVM框架可以有很多个前端和很多个后端,只要你想继续扩展。
微观的LLVM指的是LLVM的core,或者是说实际开发和使用中的具体的LLVM。也可以简单的理解为名为LLVM的源码包。编译LLVM和Clang的时候,LLVM的源码包是不包含Clang的源码包的,需要单独下载Clang的源码包。
Clang和微观LLVM一起构成了一个完整的编译器,Clang是前端,中端优化和后端都在微观LLVM之中。
clang和gcc区别
Clang和GCC的主要区别如下
- Clang比GCC编译用的时间更短,包括预处理、语法分析、解析、语义分析、抽象语法树生成的时间。
- Clang比GCC的内存占用更小。
- Clang生成的中间产物比GCC更小。
- Clang的错误提示比GCC更加友好。
- Clang有静态分析,GCC没有。
- Clang使用BSD许可证,GCC使用GPL许可证。
- Clang从一开始就被设计为一个API,允许它被源代码分析工具和IDE集成。GCC被构建成一个单一的静态编译器,这使得它非常难以被作为API并集成到其他工具中。
- GCC比Clang支持更多的语言,例如Java。
- GCC比Clang支持更多的平台。
- GCC比Clang更流行。
整体总结:Clang具有以下优点:
- 编译速度块,内存占用小
- 诊断信息可读性强
- 模块化设计,易于扩展增强,易于 IDE 集成及其他用途的重用
- 与GCC、MSVC兼容
ubuntu20.04 安装clang
安装过程
参考URL: https://zhuanlan.zhihu.com/p/102028114
Ubuntu 20.04下直接装不行,sudo apt install clang 会提依赖问题。
sudo apt install clang
为了找到问题所在,使用apt 把依赖的包都放到命令上,比如第一个提示的是 clang-10
sudo apt install clang clang-10
这时会提示一堆库依赖问题,选一个放到clang-10后面继续回车
提醒 libclang-common-10-dev
apt-get install libclang-common-10-dev
又提醒
libclang-common-10-dev : Depends: lib32gcc-s1 (>= 4.2) but it is not going to be installed
Depends: lib32stdc++6 (>= 4.1.1) but it is not going to be installed
Depends: libc6-i386 (>= 2.17) but it is not going to be installed
使用官方预编译二进制安装
以在Ubuntu 20.04安装LLVM 13.0.0为例
sudo mkdir -p /usr/local
cd /usr/local
sudo wget https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.0/clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04.tar.xz
sudo tar xvf clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04.tar.xz
sudo mv clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04 llvm
export PATH="$PATH:/usr/local/llvm/bin"
查看clang版本:
clang -v
亲测可用!缺点,就是wget 从github下载速度比较慢。