使用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 SP3 | LLVM12 | yum install -y clang | LLVM17、LLVM18 | yum install -y llvm-toolset-17 yum install -y llvm-toolset-18 |
22.03 LTS SP4 | LLVM12 | yum install -y clang | LLVM17、LLVM18 | yum install -y llvm-toolset-17 yum install -y llvm-toolset-18 |
24.03 LTS | LLVM17 | yum install -y clang | NA | NA |
24.03 LTS SP1 | LLVM17 | yum install -y clang | LLVM18 | yum install -y llvm-toolset-18 |
25.03 | LLVM17 | yum install -y clang | LLVM18、LLVM19 | yum 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的用户指导。
文档捉虫