准备工作:
操作系统:centos6.5
位数:64位
gcc-4.8.2.tar.gz下载地址:http://gcc.skazkaforyou.com/releases/gcc-4.8.2/gcc-4.8.2.tar.gz
一、编写本文的前提:
本人在centos6.5上安装qt-5.7时报了如下的错误:
cc1plus: 错误:无法识别的命令行选项“-std=c++11”
经过查阅相关资料发现原因是本centos6.5系统的gcc版本太低,查看当前gcc版本信息:
[root@localhost lib]# gcc -v
使用内建 specs。
目标:x86_64-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
[root@localhost lib]#
当前版本信息为gcc-4.4.7,出现上面的原因至少需要gcc-4.7以上版本
二、升级gcc到gcc-4.8.2
1、通过上面链接下载源码并解压
#tar -xzvf gcc-4.8.2.tar.gz
2、进入目录并进行配置
#cd gcc-4.8.2
#./contrib/download_prerequisites
这个神奇的脚本文件会帮我们下载、配置、安装依赖库,可以节约我们大量的时间和精力,脚本会自动下载三个依赖库别为gmp-4.3.2、mpfr-2.4.2、mpc-0.8.1
或者手动下载并安装
ftp://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.bz2
http://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.bz2
http://www.multiprecision.org/mpc/download/mpc-0.8.1.tar.gz
本人在这里使用了脚本,发现半天都跑不完,到最后居然不动了,因此本人手动下载安装,首先获取三个源码:
#tar -jxvf gmp-4.3.2.tar.bz2
#cd gmp-4.3.2
#./configure --prefix=/usr
# make
# make install
#tar -jxvf mpfr-2.4.2.tar.bz2
#cd mpfr-2.4.2
#./configure --prefix=/usr
#make
#install
#tar -xzvf mpc-0.8.1.tar.gz
#cd mpc-0.8.1
#./configure --prefix=/usr
#make
#make install
注意:如果先安装mpc-0.8.1.tar.gz后安装mpfr-2.4.2.tar.bz2会报错
configure: error: libmpfr not found or uses a different ABI (including static vs shared).
所以就按上述步骤安装即可。
3、出错处理
进入gcc-4.8.2目录进行配置编译
#cd gcc-4.8.2
#./configure --prefix=/usr --enable-threads=posix --disable-checking --enable-languages=c,c++ --disable-multilib
#make
gcc的参数配置:
–prefix //默认gcc的安装目录,最好跟原有的gcc的安装目录一致
–disable-checking //生成的编译器在编译过程中不做额外检查,也可以使用–enable-checking=xxx来增加一些检查;
–enable-languages //指定gcc能编译哪些语言的文件,每种语言用逗号分隔, 例如 c,c++,java
–disable-multilib //默认gcc能在32位系统上将代码编译成64位程序,或者在64位系统上编译成32位程序,如果加上这个编译选项则表示关闭这个gcc的交叉编译功能。
找到错误的原因:“when loading shared libraries:libmpc.so.3:cannot open shared object file: No such file or directory”.
原来如此,接下来把mpc ,gmp,mpfr 的lib文件夹果断加入到 LD_LIBRARY_PATH 变量
注意此处的三个lib,根据你所安装的路径来设置。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib
1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令
ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*),
进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.
2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它”非/lib或/usr/lib”目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中
3) 如果共享库文件安装到了其它”非/lib或/usr/lib” 目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径).
那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库.
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下,
其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
从上面我们可以发现我们解压安装的三个源码链接都安装在了/usr/lib目录下,因此不需要LD_LIBRARY_PATH环境变量,只需要执行
#ldconfig
对于ldconfig上面已经介绍了,接下来继续执行
#make
你会发现不会报上面错误了,但是这里make比较耗时,至少半个小时吧,
#make install
4、验证
验证:gcc -v;或者g++ -v,如果显示的gcc版本仍是以前的版本,就需要重启系统;或者可以查看gcc的安装位置:which gcc;然后在查看版本 /usr/local/bin/gcc -v,通常gcc都安装在该处位置
[root@localhost include]# /usr/local/bin/gcc -v
使用内建 specs。
COLLECT_GCC=/usr/local/bin/gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper
目标:x86_64-unknown-linux-gnu
配置为:./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --with-gmp=/usr/lib --with-mpc=/usr/lib --with-mpfr=/usr/lib
线程模型:posix
gcc 版本 4.8.2 (GCC)
[root@localhost include]#