在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
执行以下命令:
sudo yum install texinfo -y
tar xvf gcc-9.1.0.tar.xz
cd gcc-9.1.0
contrib/download_prerequisites
mkdir -p build
cd build
../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
make -j4
然后就是漫长的等待,根据机器配置不同需要编译几个小时。
编译完成后使用root账号执行安装命令:
make install
ln -s /usr/local/lib64/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6.0.26
ldconfig
ln -s /usr/local/include/c++/9.1.0 /usr/include/c++/9.1.0
ln -s /usr/local/lib/gcc/x86_64-pc-linux-gnu/9.1.0 /usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0
由于在配置时是安装到/usr/local下,所以新版本的GCC并不会与系统原来的版本冲突,但有有一些编译工具,比如CMake在默认情况下还是使用的/usr/bin/cc以及/usr/bin/c++来编译c/c++文件,所以需要把这两个文件处理一下。
mv /usr/bin/c++ /usr/bin/c++4.4.7
update-alternatives --install /usr/bin/cc cc /usr/local/bin/gcc 100
update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 100
update-alternatives --install /usr/bin/c++ c++ /usr/local/bin/c++ 100
update-alternatives --install /usr/bin/c++ c++ /usr/bin/c++4.4.7 100
以上命令先把原来的c++更名,再使用update-alternatives安装cc与c++的两个版本,安装好后分别执行:
update-alternatives --config cc
update-alternatives --config c++
按提示,选择/usr/local/bin/目录的编号即可切换到最新的版本,如果想要切回去,选择另一个版本即可。
由于安装Clang8.0需要使用到Python 2.7及以上版本的Python,索性安装一个最新版本。
1.安装Python3.7,需要先安装1.0.2或者1.1兼容版本,可以从OpenSSL下载。
解压后在openssl-1.1.1b目录执行:
./config
make -j4
make intall
2.Python-3.7.3.tar.xz
3.执行:
yum -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
tar xvf Python-3.7.3.tar.xz
cd Python-3.7.3
./configure --enable-optimizations --enable-shared
>make -j4
>sudo make install
>rm /usr/bin/python2 -f
>ln -s /usr/bin/python2.6 /usr/bin/python2
>rm /usr/bin/python -f
>update-alternatives --install /usr/bin/python python /usr/local/bin/python3 100
>update-alternatives --install /usr/bin/python python /usr/bin/python2.6 100
>update-alternatives --config python
编译大概需要1小时左右。
由于是使用了–enable-shared参数,所以还需要在/etc/ld.so.conf.d目录中添加一个文件,可以命名为python.conf,内容为:
/usr/local/lib
/usr/local/lib64
然后执行:
ldconfig
由于使用了–enable-optimizations参数,如果编译器的版本过低,可能会出现错误:
make build_all CFLAGS_NODIST=" -fprofile-use -fprofile-correction" LDFLAGS_NODIST=""
make[1]: Entering directory `/usr/local/src/Python-3.8.0'
./python -E -S -m sysconfig --generate-posix-vars ;\
if test $? -ne 0 ; then \
echo "generate-posix-vars failed" ; \
rm -f ./pybuilddir.txt ; \
exit 1 ; \
fi
Could not import runpy module
Traceback (most recent call last):
File "/usr/local/src/Python-3.8.0/Lib/runpy.py", line 15, in <module>
import importlib.util
File "/usr/local/src/Python-3.8.0/Lib/importlib/util.py", line 14, in <module>
from contextlib import contextmanager
File "/usr/local/src/Python-3.8.0/Lib/contextlib.py", line 4, in <module>
import _collections_abc
SystemError: <built-in function compile> returned NULL without setting an error
generate-posix-vars failed
make[1]: *** [pybuilddir.txt] Error 1
make[1]: Leaving directory `/usr/local/src/Python-3.8.0'
make: *** [profile-opt] Error 2
解决方法:
1.可以升级到GCC 8.1版本及以上
2.去掉–enable-optimizations参数
由于版本问题,需要安装新一些的SWIG,不然在编译llvm8.0/llvm-8.0.0.src/build/tools/lldb/scripts下生成的LLDBWrapPython.cpp文件时会编译不过,可以安装最新的swig-4.0.0,
解压到swig-4.0.0,然后执行:
cd swig-4.0.0
mkdir -p build
cd build
../configure --without-pcre --prefix=/usr/local/swig4
mv /usr/bin/swig /usr/bin/swig1.3
ln -s /usr/local/swig4/bin/swig /usr/bin/swig
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
然后执行以下命令:
yum install ncurses-devel -y
yum install libedit-devel -y
tar xf llvm-8.0.0.src.tar.xz
cd llvm-8.0.0.src
mkdir -p tools/clang
mkdir -p tools/clang/tools/extra
mkdir -p tools/lld
mkdir -p tools/lldb
mkdir -p tools/polly
mkdir -p projects/compiler-rt
mkdir -p projects/libcxx
mkdir -p projects/libcxxabi
mkdir -p projects/libunwind
mkdir -p projects/openmp
tar xf ../cfe-8.0.0.src.tar.xz -C tools/clang --strip-components=1
tar xf ../clang-tools-extra-8.0.0.src.tar.xz -C tools/clang/tools/extra --strip-components=1
tar xf ../lld-8.0.0.src.tar.xz -C tools/lld --strip-components=1
tar xf ../lldb-8.0.0.src.tar.xz -C tools/lldb --strip-components=1
tar xf ../polly-8.0.0.src.tar.xz -C tools/polly --strip-components=1
tar xf ../compiler-rt-8.0.0.src.tar.xz -C projects/compiler-rt --strip-components=1
tar xf ../libcxx-8.0.0.src.tar.xz -C projects/libcxx --strip-components=1
tar xf ../libcxxabi-8.0.0.src.tar.xz -C projects/libcxxabi --strip-components=1
tar xf ../libunwind-8.0.0.src.tar.xz -C projects/libunwind --strip-components=1
tar xf ../openmp-8.0.0.src.tar.xz -C projects/openmp --strip-components=1
mkdir build
cd build
cmake .. -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文件,根据需要设置一下下面这些参数
//Enable to build Debian packages
CPACK_BINARY_DEB:BOOL=OFF
//Enable to build FreeBSD packages
CPACK_BINARY_FREEBSD:BOOL=OFF
//Enable to build IFW packages
CPACK_BINARY_IFW:BOOL=OFF
//Enable to build NSIS packages
CPACK_BINARY_NSIS:BOOL=OFF
//Enable to build RPM packages
CPACK_BINARY_RPM:BOOL=ON
//Enable to build STGZ packages
CPACK_BINARY_STGZ:BOOL=OFF
//Enable to build TBZ2 packages
CPACK_BINARY_TBZ2:BOOL=OFF
//Enable to build TGZ packages
CPACK_BINARY_TGZ:BOOL=OFF
//Enable to build TXZ packages
CPACK_BINARY_TXZ:BOOL=OFF
//Enable to build TZ packages
CPACK_BINARY_TZ:BOOL=OFF
//Enable to build RPM source packages
CPACK_SOURCE_RPM:BOOL=OFF
//Enable to build TBZ2 source packages
CPACK_SOURCE_TBZ2:BOOL=OFF
//Enable to build TGZ source packages
CPACK_SOURCE_TGZ:BOOL=OFF
//Enable to build TXZ source packages
CPACK_SOURCE_TXZ:BOOL=OFF
//Enable to build TZ source packages
CPACK_SOURCE_TZ:BOOL=OFF
//Enable to build ZIP source packages
CPACK_SOURCE_ZIP:BOOL=OFF
由于系统是CentOS,支持RPM安装包,所以这里我是把CPACK_BINARY_RPM设置为ON,其它参数都设置为OFF
配置完成后进行编译:
make -j4
进入漫长的等待,编译时间根据机器配置不同,需要编译几个小时。
编译完成后使用root账号执行:
make install
进行安装,也可以执行:
cpack
进行RPM打包,然后使用:
rpm -ivh LLVM-8.0.0-Linux.rpm --nodeps
进行安装。
强烈建议使用RPM安装包进行安装,这样方便卸载。
如果要卸载非常方便,使用:
rpm -e llvm
即可干净卸载。
btw:如果想要在项目中查看libc++库中的调试信息,需要定义宏:_LIBCPP_DEBUG为0或1,否则会无法查看其中的调试信息。 参见:https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html#libcpp-debug-macro
比如,下面的代码:
std::string str("This is a test string for clang\n");
如果未定义此宏,使用GDB调试std::string str时,使用命令:
p str
会出现:
$1 =
使用命令:
p str.__r_
会出现
There is no member named __r_.
祝好!