ubuntu22.04搭建clang环境
LLVM、Clang、gcc、msvc的关系
编译原理中学习过,一个编译器可以分为三个部分:
- Frontend前端:词法分析、语法分析、语义分析和中间代码生成
- Optimizer优化器:中间代码优化
- Backend后端:生成机器码
LLVM架构
LLVM中,不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
如果需要开发一种新的变成语言,只需要设计一种新的编译前端,将这种编程语言翻译成LLVM IR
如果需要支持一种新的硬件设备,只需要设计一种新的编译后端,将LLVM IR生成对应硬件的机器代码
从上图可以看到,clang只是基于LLVM架构的C/C++/Objective-C编译器前端。
- clang与LLVM的关系
当出现LLVM时,根据语境有不同的含义,可以是广义上指整个LLVM架构,包括前端,优化器,后端。也可以狭义指专用于代码优化和目标代码生成的LLVM后端。
- clang、msvc(Microsoft Visual C++)、gcc之间的关系(主要从编译器使用者的角度看三者之间的关系,而不是从编译原理理论角度)
- 平台支持:msvc主要用于Windows平台,而gcc/clang则可以用于Windows/Linux/MacOS等所有平台。
- gcc/clang往往和msvc不兼容。具体的说,gcc下的代码如果要支持msvc,可能需要进行一些额外的工作来支持不同的编译器。
编译LLVM
LLVM GitHub Page:https://github.com/llvm/llvm-project
编译LLVM前,需要一些额外的配置:具体可以查看https://llvm.org/docs/GettingStarted.html#requirements
- 按照bulid-essential,bulid-essential包含 g++, gcc, make 等必须依赖包。
1 | sudo apt install build-essential |
构建工具选择ninja
ninja github page:https://github.com/ninja-build/ninja
下载ninja-linux,解压,其中有一个
ninja
文件将其复制到
/usr/local/bin
:1
sudo cp ./ninja /usr/local/bin
赋予可执行权限
1
sudo chmod a+x /usr/local/bin/ninja
查看ninja版本
1
ninja --version
编译LLVM
1 | git clone https://github.com/llvm/llvm-project.git |
等待编译完成
参考: