之前想在CentOS系统上安装clang 3.6版本,由于yum上版本太低,想通过源码编译安装。按照网上说的源码安装步骤,下好llvm、clang、clang-tools-extra和compiler-rt后,总在make install的最后一步安装失败。为了找到解决办法,去查llvm.org官网信息,结果发现从clang 3.8开始官网开始提供适于centos 6版本的二进制版本:Clang for CentOS 6 x86_64 (.sig) 果断下载二进制版本,解压并cd到bin目录,运行clang –version命令,出现以下提示信息:
clang: /lib64/libc.so.6: version `GLIBC_2.15′ not found (required by clang)
clang: /lib64/libc.so.6: version `GLIBC_2.14′ not found (required by clang)
clang: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18′ not found (required by clang)
clang: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15′ not found (required by clang)
这里是两个系统版本库版本过低的问题,一个是关于C++的库libstdc++, 一个是关于C系统基础运行库GLIBC。
1. 先解决GLIBCXX的问题,C++库,首先查看错误信息提示中的lib文件的信息。
$ strings /usr/lib64/libstdc++.so.6 | grep GLIBC这里是打印 libstdc++.so.6的输出信息中限定(grep) GLIBC库的信息
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
再查gcc版本,发现是4.4,确实比较旧,先升级gcc版本。
由于公司机房网络限制不能上外网,安装gcc比较曲折。先通过别的方式准备好gcc的安装包gcc-4.8.2.tar.gz。解压gcc-4.8.2.tar.gz到当前目录下,并进入gcc目录,如果有网络,运行./contrib/download_prerequisites文件可以直接帮我们安装依赖,没有网络的话,查看/contrib/download_prerequisites文件,里面主要是下载安装三个文件:mpfr/gmp/mpc。这里只能自己手动安装。
分别下载mpfr/gmp/mpc三个文件,并解压安装。由于mpc依赖于mpfr和gmp,mpfr依赖于gmp,故安装顺序依次为gmp、mpfr、mpc。
gmp-4.3.2.tar.bz2
mpfr-2.4.2.tar.bz2
mpc-0.8.1.tar.gz
编译安装gmp
$tar -jvxf ~/gmp-4.3.2.tar.bz2
$cd gmp-4.3.2
$./configure –prefix=~/gcclib/gmp432(自定义配置路径)
$make && make install
编译安装mpfr
$tar -jxvf ~/mpfr-2.4.2.tar.bz2
$cd mpfr-2.4.2/
$./configure –prefix=~/gcclib/mpfr242 –with-gmp=~/gcclib/gmp432/ (依赖于gmp)
$make && make install
编译安装mpc
$tar -zxvf ~/mpc-0.8.1.tar.gz
$cd mpc-0.8.1/
$./configure –prefix=~/gcclib/mpc081 –with-gmp=~/gcclib/gmp432/ –with-mpfr=~/gcclib/mpfr242/ (依赖于gmp与mpfr)
$make && make install
编译安装gcc
$tar -zvxf ~/gcc-4.8.2.tar.gz
$cd gcc-4.8.2
$./configure –prefix=~/gcc482 –enable-threads=posix –disable-checking –disable-multilib –enable-languages=c,c++ –with-gmp=~/gcclib/gmp432/ –with-mpfr=~/gcclib/mpfr242/ –with-mpc=~/gcclib/mpc081/
解释一下参数:
–enable-threads=posix//可用线程
-disable-checking//禁用检查
–disable-multilib//默认gcc 能在32位系统上将代码编译成64位程序,或者在64位系统上编译成32位程序,如果加上这个编译选项则表示关闭这个gcc的交叉编译功能。
–enable-languages //指定 gcc 能编译哪些语言的文件,每种语言用逗号分隔, 例如 c,c++,Java
详细的参数介绍可以在官网看到:https://gcc.gnu.org/install/configure.html
$如果此时执行”make”命令的话,那后果会相当的痛苦,默认安装情况,所有lib共享库都会被放到系统目录下如64位的/usr/lib64/,而我们手动指定目录的形式,系统在编译构建的时候是找不到的,就是说GCC找不到之前我们安装的三个lib库,so我们这样做,即使没权限,仍可以建立全局的临时路径。
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/gcclib/gmp432/lib:~/gcclib/mpfr242/lib:~/gcclib/mpc081/lib(保证原有的参数正确,加上新的共享路径,用冒号分隔)
$make(需要时间较长)
$make install
$~/gcc482/bin/gcc -v (查看安装版本,验证是否安装成功)
安装完成后再建立软链接即可。
2.升级GLIBC_2.15′
glibc的下载地址:http://ftp.gnu.org/gnu/glibc/
或者:http://www.gnu.org/software/libc/download.html
————————————————————————
安装:
下载的glibc的源码解压到某个目录,并进入源码目录 建立构建目录,并cd进入构建目录:
$ mkdir build
$ cd build
配置:
运行configure :
$ ../configure –prefix=/opt/glibc-2.15
$ make -j4
$ sudo make install
临时修改环境变量:
$ export LD_LIBRARY_PATH=/opt/glibc-2.15/lib:$LD_LIBRARY_PATH
安装完成后,运行clang不再报错。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141330.htm