ubuntu 20.04 中源码编译 llvm-clang 15.0.7

发布时间 2023-08-12 10:57:29作者: CleanSky

1. 准备工作

1.1 源码下载

本文介绍安装 llvm 和 clang,主要目的是基于 llvm 和 clang 进行二次开发,因此我们只安装 llvm 和 clang。需要下载下面的三个包(下载的地址:Release LLVM 15.0.7 · llvm/llvm-project · GitHub):

说明:llvm 15.0.7 和 之前版本在安装的时候的一个很大的区别,就在于必须同时下载 cmake,否在在编译时会报各种错误,这里就不给大家展示具体报错了,可以参考下面链接(LLVM 15.0.0-rc1: CMake Error at cmake/modules/CMakeLists.txt · Issue #56971 · llvm/llvm-project · GitHub)了解。

1.2 源码解压

主要操作如下:

  • 解压前面一步下载到的三个文件
  • llvm-15.0.7.src 重命名为 llvm(图好看,这一步可以不做)
  • clang-15.0.7.src 重命名为 clang,放到 llvm 源码的 tools 目录下
  • cmake-15.0.7.src 的 Modules 目录下面的文件,都拷贝到 llvm 源码的 cmake/modules 下面
tar -xf clang-15.0.7.src.tar.xz
tar -xf cmake-15.0.7.src.tar.xz
tar -xf llvm-15.0.7.src.tar.xz

mv llvm-15.0.7.src llvm

mv clang-15.0.7.src clang
mv clang llvm/tools/

cp cmake-15.0.7.src/Modules/* llvm/cmake/modules/

1.3 依赖库安装

llvm 在安装时,需要依赖如下的部分组件(均可以直接通过 apt install,基于 ubuntu 20.04,安装的版本都可以直接符合要求):

  • gcc和g++(直接安装的是 9.4.0版本)
  • cmake(3.16.3)
  • make(4.2.1)
  • python3(3.8.10)

2. 安装 llvm 15.0.7

2.1 基本执行命令

如下面的脚本所示:

cd llvm
mkdir build
cd build
cmake ../ -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_INCLUDE_BENCHMARKS=OFF
		 
make -j8 && make install

说明:

在上面,相对于之前构建 llvm 10 等版本,新增了一个参数 LLVM_INCLUDE_BENCHMARKS 设置为 OFF,其实我也不是很清楚这个参数的含义,只是不设置这个参数,会报下面的错误:

CMake Error at CMakeLists.txt:1294 (add_subdirectory):
  add_subdirectory given source
  "/mnt/d/wsl/test/llvm/install/llvm/../third-party/benchmark" which is not
  an existing directory.

3. 安装完成确认

maijun@LAPTOP-EEQ9H1QS:/mnt/d/wsl/tools/llvm-15.0.7.obj/bin$ ./clang -v
clang version 15.0.7
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /mnt/d/wsl/tools/llvm-15.0.7.obj/bin/.
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64
maijun@LAPTOP-EEQ9H1QS:/mnt/d/wsl/tools/llvm-15.0.7.obj/bin$ ./llvm-config --version

4. 安装问题解决

4.1 collect2: fatal error: ld terminated with signal 9

这个报错是在编译 Debug 版本的时候遇到的,在编译 Release 或者 MinSizeRel 时并没有遇到。报错的原因:swap空间不够,需要创建更多的 swap 空间。

查看可用的swapon空间:

sudo swapon --show

创建更多的 swap 空间的方法:

# 创建 swapfile 文件夹
sudo mkdir /swapfile

cd /swapfile
# 在 swapfile 文件夹下,创建一个大小为20000000的空文件
sudo dd if=/dev/zero of=swap bs=1024 count=20000000

# 将生成的文件转换成swap类型的文件
sudo mkswap -f swap

# 激活 swap 文件
sudo swapon swap

如果使用完,要卸载的话,使用 swapoff:

sudo swapoff swap