ubuntu22.04搭建clang环境

LLVM、Clang、gcc、msvc的关系

编译原理中学习过,一个编译器可以分为三个部分:

  • Frontend前端:词法分析、语法分析、语义分析和中间代码生成
  • Optimizer优化器:中间代码优化
  • Backend后端:生成机器码

img

LLVM架构

img

LLVM中,不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)

如果需要开发一种新的变成语言,只需要设计一种新的编译前端,将这种编程语言翻译成LLVM IR

如果需要支持一种新的硬件设备,只需要设计一种新的编译后端,将LLVM IR生成对应硬件的机器代码

从上图可以看到,clang只是基于LLVM架构的C/C++/Objective-C编译器前端

  • clang与LLVM的关系

LLVM: Low-Level Virtual Machine

当出现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
2
3
4
5
6
7
8
9
10
git clone https://github.com/llvm/llvm-project.git
mkdir llvm-project/build
cd llvm-project/build
cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS=clang \
-DLLVM_BUILD_EXAMPLES=ON \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON
ninja -j16 # 16核并行运行16个任务
cmake --install . --prefix /usr/local # or somewhere else

等待编译完成

参考:

https://aosabook.org/en/v1/llvm.html

https://hyfshishen.github.io/tutorial-01-llvm.html