ubuntu 20.04 中源码编译 llvm-clang 15.0.7
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