在Cent OS 6.X中要安装Clang 8.0必须要使用GCC 4.8及以上版本才能编译,但系统自带的是4.4.7版本的,看了一下GCC,最新版本已经到9.1了,而且从6.X开始也支持像Clang一样的有颜色的编译输出了,感觉很不错,GCC也可以一改往常的单调颜色了。

参见 https://gcc.gnu.org/gcc-9/changes.html

一、安装GCC 9.1

1.下载GCC 9.1的安装包gcc-9.1.0.tar.xz

2.编译

执行以下命令:

1sudo yum install texinfo -y
2tar xvf gcc-9.1.0.tar.xz
3cd gcc-9.1.0
4contrib/download_prerequisites
5mkdir -p build
6cd build
7../configure --disable-multilib --enable-languages=c,c++ --prefix=/usr/local --enable-threads=posix --enable-bootstrap --enable-shared --with-system-zlib --enable-plugin --with-cpu=generic --build=x86_64-redhat-linux
8make -j4

然后就是漫长的等待,根据机器配置不同需要编译几个小时。 编译完成后使用root账号执行安装命令:

1make install

3.配置libstdc++版本

1ln -s /usr/local/lib64/libstdc++.so.6.0.26  /usr/lib64/libstdc++.so.6.0.26
2ldconfig

4.配置头文件与库文件目录

1ln -s /usr/local/include/c++/9.1.0   /usr/include/c++/9.1.0
2ln -s /usr/local/lib/gcc/x86_64-pc-linux-gnu/9.1.0  /usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0

5.与系统原来的GCC/G++共存

由于在配置时是安装到/usr/local下,所以新版本的GCC并不会与系统原来的版本冲突,但有有一些编译工具,比如CMake在默认情况下还是使用的/usr/bin/cc以及/usr/bin/c++来编译c/c++文件,所以需要把这两个文件处理一下。

1mv /usr/bin/c++ /usr/bin/c++4.4.7
2update-alternatives --install /usr/bin/cc cc /usr/local/bin/gcc 100
3update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 100
4update-alternatives --install /usr/bin/c++ c++ /usr/local/bin/c++ 100
5update-alternatives --install /usr/bin/c++ c++ /usr/bin/c++4.4.7 100

以上命令先把原来的c++更名,再使用update-alternatives安装cc与c++的两个版本,安装好后分别执行:

1update-alternatives --config cc
2update-alternatives --config c++

按提示,选择/usr/local/bin/目录的编号即可切换到最新的版本,如果想要切回去,选择另一个版本即可。

二、安装Python 3.7

由于安装Clang8.0需要使用到Python 2.7及以上版本的Python,索性安装一个最新版本。

1.安装Python3.7,需要先安装1.0.2或者1.1兼容版本,可以从 OpenSSL下载。 解压后在openssl-1.1.1b目录执行:

1./config
2make -j4
3make intall

2. Python-3.7.3.tar.xz 3.执行:

 1yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
 2tar xvf Python-3.7.3.tar.xz
 3cd Python-3.7.3
 4./configure --enable-optimizations --enable-shared
 5>make -j4
 6>sudo make install
 7>rm /usr/bin/python2 -f
 8>ln -s /usr/bin/python2.6 /usr/bin/python2
 9>rm /usr/bin/python -f
10>update-alternatives --install /usr/bin/python python /usr/local/bin/python3 100
11>update-alternatives --install /usr/bin/python python /usr/bin/python2.6 100
12>update-alternatives --config python

编译大概需要1小时左右。

由于是使用了–enable-shared参数,所以还需要在/etc/ld.so.conf.d目录中添加一个文件,可以命名为python.conf,内容为:

1/usr/local/lib
2/usr/local/lib64

然后执行:

1ldconfig

由于使用了–enable-optimizations参数,如果编译器的版本过低,可能会出现错误:

 1make build_all CFLAGS_NODIST=" -fprofile-use -fprofile-correction" LDFLAGS_NODIST=""
 2make[1]: Entering directory `/usr/local/src/Python-3.8.0'
 3./python -E -S -m sysconfig --generate-posix-vars ;\
 4if test $? -ne 0 ; then \
 5	echo "generate-posix-vars failed" ; \
 6	rm -f ./pybuilddir.txt ; \
 7	exit 1 ; \
 8fi
 9Could not import runpy module
10Traceback (most recent call last):
11  File "/usr/local/src/Python-3.8.0/Lib/runpy.py", line 15, in <module>
12    import importlib.util
13  File "/usr/local/src/Python-3.8.0/Lib/importlib/util.py", line 14, in <module>
14    from contextlib import contextmanager
15  File "/usr/local/src/Python-3.8.0/Lib/contextlib.py", line 4, in <module>
16    import _collections_abc
17SystemError: <built-in function compile> returned NULL without setting an error
18generate-posix-vars failed
19make[1]: *** [pybuilddir.txt] Error 1
20make[1]: Leaving directory `/usr/local/src/Python-3.8.0'
21make: *** [profile-opt] Error 2

解决方法: 1.可以升级到GCC 8.1版本及以上 2.去掉–enable-optimizations参数

三、安装swig

由于版本问题,需要安装新一些的SWIG,不然在编译llvm8.0/llvm-8.0.0.src/build/tools/lldb/scripts下生成的LLDBWrapPython.cpp文件时会编译不过,可以安装最新的 swig-4.0.0, 解压到swig-4.0.0,然后执行:

1cd swig-4.0.0
2mkdir -p build
3cd build
4../configure --without-pcre --prefix=/usr/local/swig4
5mv /usr/bin/swig /usr/bin/swig1.3
6ln -s /usr/local/swig4/bin/swig /usr/bin/swig

四、安装LLVM/Clang 8.0

1.下载LLVM/Clang等全部源代码(不包括test-suite) LLVM source code Clang source code compiler-rt source code libc++ source code libc++abi source code libunwind source code LLD Source code LLDB Source code OpenMP Source code Polly Source code clang-tools-extra

然后执行以下命令:

 1yum install ncurses-devel -y
 2yum install libedit-devel -y
 3tar xf llvm-8.0.0.src.tar.xz
 4cd llvm-8.0.0.src
 5mkdir -p tools/clang
 6mkdir -p tools/clang/tools/extra
 7mkdir -p tools/lld
 8mkdir -p tools/lldb
 9mkdir -p tools/polly
10mkdir -p projects/compiler-rt
11mkdir -p projects/libcxx
12mkdir -p projects/libcxxabi
13mkdir -p projects/libunwind
14mkdir -p projects/openmp
15tar xf ../cfe-8.0.0.src.tar.xz -C tools/clang --strip-components=1
16tar xf ../clang-tools-extra-8.0.0.src.tar.xz -C tools/clang/tools/extra --strip-components=1
17tar xf ../lld-8.0.0.src.tar.xz -C tools/lld --strip-components=1
18tar xf ../lldb-8.0.0.src.tar.xz -C tools/lldb --strip-components=1
19tar xf ../polly-8.0.0.src.tar.xz -C tools/polly --strip-components=1
20tar xf ../compiler-rt-8.0.0.src.tar.xz -C projects/compiler-rt --strip-components=1
21tar xf ../libcxx-8.0.0.src.tar.xz -C projects/libcxx --strip-components=1
22tar xf ../libcxxabi-8.0.0.src.tar.xz -C projects/libcxxabi --strip-components=1
23tar xf ../libunwind-8.0.0.src.tar.xz -C projects/libunwind --strip-components=1
24tar xf ../openmp-8.0.0.src.tar.xz -C projects/openmp --strip-components=1
25mkdir build
26cd build
27cmake .. -DCMAKE_BUILD_TYPE=Release -DLLVM_LIBDIR_SUFFIX=64 -DCMAKE_INSTALL_PREFIX=/usr/local/llvm8 -DCLANG_DEFAULT_CXX_STDLIB:STRING=libc++

cmake参数说明: 1.如果不指定编译为Release则默认是编译的Debug版本,需要占用比较大的内存(内存不足则需要较大的交换分区,总共大概需要13G左右的内存加交换分区)以及磁盘空间。所以需要使用-DCMAKE_BUILD_TYPE=Release指定编译为Release版本。 2.如果不指定-DLLVM_LIBDIR_SUFFIX=64参数则会把生成的库放在lib目录下,而不是lib64。 3.-DCMAKE_INSTALL_PREFIX=/usr/local/llvm8指定安装目录 4.CLANG_DEFAULT_CXX_STDLIB:STRING=libc++,指定使用LLVM的libc++库,默认使用的是GCC的libstdc++库。如果编译了LLVM的C++库,则需要指定此项方可使用。 5.-DGCC_INSTALL_PREFIX=/usr/local/gcc-9.1.0指定GCC的安装目录,如果想要指定使用GCC的库,即libstdc++库而不是clang自己的库(libc++)则需要指定该参数,否则会导致找不到头文件以及其它错误

如果想要支持打包,可以手动打开CMakeCache.txt文件,根据需要设置一下下面这些参数

 1//Enable to build Debian packages
 2CPACK_BINARY_DEB:BOOL=OFF
 3
 4//Enable to build FreeBSD packages
 5CPACK_BINARY_FREEBSD:BOOL=OFF
 6
 7//Enable to build IFW packages
 8CPACK_BINARY_IFW:BOOL=OFF
 9
10//Enable to build NSIS packages
11CPACK_BINARY_NSIS:BOOL=OFF
12
13//Enable to build RPM packages
14CPACK_BINARY_RPM:BOOL=ON
15
16//Enable to build STGZ packages
17CPACK_BINARY_STGZ:BOOL=OFF
18
19//Enable to build TBZ2 packages
20CPACK_BINARY_TBZ2:BOOL=OFF
21
22//Enable to build TGZ packages
23CPACK_BINARY_TGZ:BOOL=OFF
24
25//Enable to build TXZ packages
26CPACK_BINARY_TXZ:BOOL=OFF
27
28//Enable to build TZ packages
29CPACK_BINARY_TZ:BOOL=OFF
30
31//Enable to build RPM source packages
32CPACK_SOURCE_RPM:BOOL=OFF
33
34//Enable to build TBZ2 source packages
35CPACK_SOURCE_TBZ2:BOOL=OFF
36
37//Enable to build TGZ source packages
38CPACK_SOURCE_TGZ:BOOL=OFF
39
40//Enable to build TXZ source packages
41CPACK_SOURCE_TXZ:BOOL=OFF
42
43//Enable to build TZ source packages
44CPACK_SOURCE_TZ:BOOL=OFF
45
46//Enable to build ZIP source packages
47CPACK_SOURCE_ZIP:BOOL=OFF

由于系统是CentOS,支持RPM安装包,所以这里我是把CPACK_BINARY_RPM设置为ON,其它参数都设置为OFF

配置完成后进行编译:

1make -j4

进入漫长的等待,编译时间根据机器配置不同,需要编译几个小时。 编译完成后使用root账号执行:

1make install

进行安装,也可以执行:

1cpack

进行RPM打包,然后使用:

1rpm -ivh LLVM-8.0.0-Linux.rpm --nodeps

进行安装。 强烈建议使用RPM安装包进行安装,这样方便卸载。 如果要卸载非常方便,使用:

1rpm -e llvm

即可干净卸载。

btw:如果想要在项目中查看libc++库中的调试信息,需要定义宏:_LIBCPP_DEBUG为0或1,否则会无法查看其中的调试信息。 参见:https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html#libcpp-debug-macro

比如,下面的代码:

1std::string str("This is a test string for clang\n");

如果未定义此宏,使用GDB调试std::string str时,使用命令:

1p str

会出现:

1$1 = <incomplete type>

使用命令:

1p str.__r_

会出现

1There is no member named __r_.

祝好!