当前位置:   article > 正文

CentOS 6.X安装GCC 9.1和LLVM/Clang 8.0_yum 安装 clang 8

yum 安装 clang 8

在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.编译

执行以下命令:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

make install
  • 1

3.配置libstdc++版本

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

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

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
  • 1
  • 2

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

由于在配置时是安装到/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
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

按提示,选择/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目录执行:

./config
make -j4
make intall
  • 1
  • 2
  • 3

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

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

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

然后执行:

ldconfig
  • 1

由于使用了–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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

解决方法:
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,然后执行:

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
  • 2
  • 3
  • 4
  • 5
  • 6

四、安装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

然后执行以下命令:

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++
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

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

配置完成后进行编译:

make -j4
  • 1

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

make install
  • 1

进行安装,也可以执行:

cpack
  • 1

进行RPM打包,然后使用:

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

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

rpm -e llvm
  • 1

即可干净卸载。

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");
  • 1

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

p str
  • 1

会出现:

$1 = <incomplete type>
  • 1

使用命令:

p str.__r_
  • 1

会出现

There is no member named __r_.
  • 1

祝好!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/922870
推荐阅读
相关标签
  

闽ICP备14008679号