下载的是最新版本的代码,LLVM+Clang编译安装比较耗硬件资源,8核16G内存300G硬盘,硬盘是分两块,一块100G,另一块是200G。即使顺利跑完,保守估计也要3个小时,编译目录生成的文件有86G。
遇到几次内存和磁盘不够的问题,一一解决,下面是我的编译安装步骤和遇到的一些过程。
前期准备工作
1. 安装svn
yum install subversion
2. 升级cmake,升级到3.0以上版本。
[root@VM-100-213-centos ~]# cmake --version
cmake version 3.9.2CMake suite maintained and supported by Kitware (kitware.com/cmake).
3. 升级gcc,升级到4.8以上版本。升级gcc会遇到比较多的问题,具体网上找找,也有很多解决办法,我升级到9.0以上版本。
[root@VM-100-213-centos ~]# gcc --version
gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
编译安装过程
1. 创建目录,下载代码
下载llvm核心源码
mkdir llvm-clang
cd llvm-clang
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
下载Clang源码
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
下载Clang工具源码
cd ../../llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
下载cimpiler-rt
cd ../../llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
创建编译目录,跟llvm目录平级,执行cmake、make、make install
[root@VM-100-213-centos ~/llvm-clang]# ll
total 8
drwxr-xr-x 18 root root 4096 Nov 12 15:46 build
drwxr-xr-x 17 root root 4096 Nov 11 12:21 llvm[root@VM-100-213-centos ~/llvm-clang]# cd build/
[root@VM-100-213-centos ~/llvm-clang/build]# cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86" ../llvm
问题记录
1. 内存不足引发的编译链接失败
现象一
[ 88%] Linking CXX shared library ../../../../lib/libclang.so
collect2: fatal error: ld terminated with signal 9 [Killed]
compilation terminated.
make[2]: *** [tools/clang/tools/libclang/CMakeFiles/libclang.dir/build.make:812: lib/libclang.so.10] Error 1
make[2]: *** Deleting file 'lib/libclang.so.10'
make[1]: *** [CMakeFiles/Makefile2:56172: tools/clang/tools/libclang/CMakeFiles/libclang.dir/all] Error 2
make: *** [Makefile:152: all] Error 2
现象二
[ 91%] Linking CXX executable ../../../../../../bin/clangd-fuzzer
collect2: error: ld returned 1 exit status
make[2]: *** [tools/clang/tools/extra/clangd/fuzzer/CMakeFiles/clangd-fuzzer.dir/build.make:215: bin/clangd-fuzzer] Error 1
make[1]: *** [CMakeFiles/Makefile2:55124: tools/clang/tools/extra/clangd/fuzzer/CMakeFiles/clangd-fuzzer.dir/all] Error 2
make: *** [Makefile:152: all] Error 2
失败了还看不到有效的错误日志,网上有人指出是内存不够,打开或调大虚拟内存。
top命令查看内存,发现每次失败的时候,内存使用率接近100%;执行free命令查看,虚拟内存关闭。
[root@VM-100-213-centos ~/llvm-clang/build]# free
total used free shared buff/cache available
Mem: 16165976 380968 91392 42064 15693616 15647720
Swap: 0 0 0
打开虚拟内存,设置4G的虚拟内存空间。
[root@VM-100-213-centos ~/llvm-clang/build]# cd /data/
[root@VM-100-213-centos /data]#[root@VM-100-213-centos /data]#mkdir swap
[root@VM-100-213-centos /data]#dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096
[root@VM-100-213-centos /data]#du -sh /data/swap/swapfile
4.1G /data/swap/swapfile[root@VM-100-213-centos /data]# mkswap /data/swap/swapfile
mkswap: /data/swap/swapfile: warning: wiping old swap signature.
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=71faadb8-f7a4-466b-aecc-f1d2a8e0d291[root@VM-100-213-centos /data]# swapon /data/swap/swapfile
[root@VM-100-213-centos /data]# free
total used free shared buff/cache available
Mem: 16165976 384692 92868 42064 15688416 15643764
Swap: 4194300 0 4194300
2. 磁盘空间不足导致的编译链接失败
按上面步骤设置了虚拟内存后,还是编译失败,查看磁盘空间,光是编译目录,就有86G,相当大
# du -h --max-depth=1 ./llvm-clang/
1.4G ./llvm-clang/llvm
86G ./llvm-clang/build
87G ./llvm-clang/
根目录是挂载到100G的硬盘上,df命令查看,磁盘使用率已经到100%。
解决办法,将整个目录move到另外一块200G的磁盘上,创建一个软链接,这样一是可以解决磁盘空间不足的问题,二是解决继续编译因路径修改导致的编译错误。
#move /root/llvm-clang /data/
#ln -s /data/llvm-clang /root
# ll /root/
total 126168
lrwxrwxrwx 1 root root 17 Nov 12 15:38 llvm-clang -> /data/llvm-clang/
继续编译安装
#cd /root/llvm-clang/build
#make
#make install
到此主要问题都解决了。
归纳起来主要几个原因:
- 内存不足导致链接失败
- 磁盘空间不足导致链接失败
- 硬件配置不够整个过程需要耗费大量时间。
卸载llvm
安装llvm,目测磁盘至少50G,相当耗费磁盘空间。如果不用,可以卸载
cd build
xargs rm < install_manifest.txt