在 ubuntu 20.04 中源码编译 llvm-clang 15.0.7
本文主要介绍在 Ubuntu 20.04 中,如何基于源码方式编译 llvm 和 clang 当前的最新版本 15.0.7(有多种构建方式,比如 cmake 和 ninja 等,本文介绍如何使用 cmake 构建). 使用的 Ubuntu 20.04 是运行在 Windows 10 的 wsl2 中。
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.
2.2 cmake 参数扩展
编译 llvm,除了上面的基本的 cmake 的参数,还有大量的其他参数,大家可以参考 llvm 官方文档:Building LLVM with CMake — LLVM 17.0.0git documentation
这里,介绍一部分我们使用的参数,给大家参考:
cmake ../ -G "Unix Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_LINK_LLVM_DYLIB=ON \
-DCMAKE_INSTALL_PREFIX=/mnt/d/wsl/tools/llvm-15.0.7.obj \
-DCMAKE_MODULE_LINKER_FLAGS_RELEASE="-Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-strong" \
-DCMAKE_SHARED_LINKER_FLAGS_RELEASE="-Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-strong" \
-DCMAKE_EXE_LINKER_FLAGS_RELEASE="-pie -Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-strong" \
-DLLVM_ENABLE_LIBCXX=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF \
-DCMAKE_CXX_FLAGS_RELEASE="-O3 -fPIE -fstack-protector-strong"
如上,最主要的配置,是新增了一部分编译器的安全编译选项。大家可以参考 gcc 的官方文档,了解编译器的安全编译选项的内容。
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
15.0.7
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
5. 参考
① llvm 官方安装文档:Building LLVM with CMake — LLVM 17.0.0git documentation
② 问题解决:ubuntu增加swap交换空间_ubuntu swap_littleRpl的博客-CSDN博客
6. 后记
其实 llvm 15.0.7 安装并不复杂,但是前后也花了一段时间,最主要是下面的三点问题:
- cmake必须下载并放到llvm源码中
- benchmark的报错
- 我使用的wsl2 ubuntu 20.04 性能太差,安装 llvm 需要的时间太长(关闭 windows defender 也没用,感觉直接在里面执行 shell命令,还不如 clion + wsl2 运行的快)
如果大家有针对 wsl2 ubuntu 20.04 操作提升性能的方法,可以留言告诉我。
- 点赞
- 收藏
- 关注作者
评论(0)