使用LLVM/Clang编译

本章介绍LLVM/Clang编译的一些基本知识,并通过示例进行实际演示。更多Clang使用方法请通过clang --help命令查询。

简介

LLVM是一种涵盖多种编程语言和目标处理器的编译器,使用Clang作为C和C++的编译和驱动程序。Clang不仅仅可以将C/C++程序编译为LLVM中间表示的IR,也会调用所有以代码生成为目标的LLVM优化遍,直到生成最终的二进制文件。

LLVM/Clang多版本安装

在openEuler操作系统中,Clang/LLVM工具链可通过官方yum仓库进行标准化安装。为兼容不同场景对LLVM版本的需求,系统采用主副版本共存机制:默认安装稳定主版本的同时,支持部署更高版本的LLVM。

openEuler版本LLVM主版本安装方式LLVM副版本安装方式
22.03 LTS SP3LLVM12yum install -y clangLLVM17、LLVM18yum install -y llvm-toolset-17
yum install -y llvm-toolset-18
22.03 LTS SP4LLVM12yum install -y clangLLVM17、LLVM18yum install -y llvm-toolset-17
yum install -y llvm-toolset-18
24.03 LTSLLVM17yum install -y clangNANA
24.03 LTS SP1LLVM17yum install -y clangLLVM18yum install -y llvm-toolset-18
25.03LLVM17yum install -y clangLLVM18、LLVM19yum install -y llvm-toolset-18
yum install -y llvm-toolset-19

以openEuler 22.03 LTS SP4为例,验证主版本安装是否成功:

shell
clang -v

clang version 12.0.1 (openEuler 12.0.1-6.oe2203sp4 f4a7df2c51fa9eb3679555ef2de92c638ba9f880)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/10.3.1
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/10.3.1
Selected GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/10.3.1
Candidate multilib: .;@m64
Selected multilib: .;@m64

验证副版本安装是否成功:

shell
source /opt/openEuler/llvm-toolset-17/enable
clang -v

clang version 17.0.6 ( 17.0.6-4.oe2203sp4)
Target: aarch64-openEuler-linux-gnu
Thread model: posix
InstalledDir: /opt/openEuler/llvm-toolset-17/root/usr/bin
System configuration file directory: /etc/llvm-toolset-17-clang/
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/10.3.1
Selected GCC installation: /usr/lib/gcc/aarch64-linux-gnu/10.3.1
Candidate multilib: .;@m64
Selected multilib: .;@m64

若返回结果中包含clang版本信息,说明安装成功。

使用示例

编译运行C/C++程序:

shell
clang  [compiler-flags]  hello.c  -o  hello.o 
./hello.o
shell
clang++ [compiler-flags]  hello.cpp  -o  hello.o 
./hello.o

指定链接器为LLVM的lld,若不指定则使用默认gcc的ld:

shell
clang [compiler-flags]  -fuse-ld=lld  hello.c  -o  hello.o 
./hello.o

手动构建支持

请参考openEuler llvm-project源码仓

更多信息请参考LLVM的用户指导