centos6升级gcc4.9.2⽀持c++11
⼀、gcc源码安装步骤
1.按⽹上⽅式下载了gmp mpfr mpc库指定版本并安装
安装mpfr过程遇到如下问题:
error while loading shared libraries: libgmp.so.10
表⽰不到XXX库,通过find到库所有的⽬录,添加到环境变量
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
export LD_LIBRARY_PATH
2.下载 gcc-4.9.2 并安装
2.1 解压后进⼊解压⽬录,执⾏如下命令⽣成Makefile⽂件
./configure --prefix=/usr/gcc-4.9.2 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++
上⾯的--prefix=/usr/gcc-4.9.2 表⽰你要将gcc安装到gcc-4.9.2的⽬录下,其它的选项可以⾃⾏去查阅configure了解
2.2 ⽣成Makefile后,执⾏make -j4编译
make的过程当中遇到错误。⽹上了资料说是内存不⾜free -m,通过增加swap⽂件分区,问题解决(期间还是出现过⼀次错误,和增加swap分区前的错误⼀样,我查看了⼀下内存,发现swap分区还是有很多剩余。所以不管它,接着make -j4,竟然莫名的好了)。
2.3 make完之后,执⾏make install安装
⼆、多个版本编译器之间的切换⽅法
安装好之后,我们通过gcc -v查看gcc版本,发现还是4.4.7的版本。为了执⾏编译命令的时候,系统使⽤4.9.2版本进⾏编译。需要将系统默认使⽤的gcc,从4.4.7版本切换到4.9.2版本,切换⽅法如下
当linux终端在接收到 gcc/g++ 命令时,shell就会到系统默认的/usr/bin⽬录下去这两个执⾏程序(执⾏shell 命令,实际上是通过shell去调⽤⼀个可执⾏程序的,并且会为每个可执⾏程序产⽣⼀个新进程)。
所以,只需要我们将/usr/bin下的gcc和g++两个4.4.7的可执⾏程序,通过软链接,重定向到我们新安装的4.9.2版本的可执⾏程序上就可以了。上⾯我们通过--prefix选项指定了gcc-4.9.2的安装⽬录为/usr/gcc-4.9.2(如果忘记了上⾯选项设置的路径,可以通过find来⼀下,这个⽐较简单,此处不多说),具体操作如下:
cd /usr/bin
mv {gcc,g++} gcc-4.4.7 //先将旧版本的gcc备份起来,以免新版本出错⽆法使⽤,备份是⼀个好习惯
ln -s /usr/gcc-4.9.2/bin/gcc /usr/bin/gcc
ln -s /usr/gcc-4.9.2/bin/g++ /usr/bin/g++
此时,我们再通过gcc -v查看gcc版本,已经是我们新安装的gcc-4.9.2版本了。
安装过程挺久挺烦⼈的,终于⼤功告成,聪明的你先happy⼀下吧。
gcc多个版本之间的切换,都可以使⽤这个⽅法,在/usr/bin⽬录下建⽴⼀个软链接指向你想要使⽤的版本(除了系统默认的gcc版本,因为系统默认的gcc版本,⽬录结构的组织是/usr/bin/gcc这种形式的,它依赖的⼀些库在/usr/lib /usr/lib64当中,所以它必须得在/usr/bin⽬录下,所以通过软链接来使⽤系统默认的版本,编译链接的时候可能会出现⼀些不到xxx库的错误!)。
通过以上的处理,去建⽴⼀个简单的程序,我们就可以使⽤新版本gcc进⾏编译了,也可以学习c++11了,但是还有⼀个⾮常重要的设置。那就是,通过以上设置,在引⽤⼀些特定库的时候,编译时还是会存在链接报错的情况。⽐如我,使⽤了stl中的list,报了如下错误。
gcc -g .obj/boostthreadexample.o .obj/charBuffer.o .obj/mysqlprogram.o .obj/structureinit.o .obj/xdbc.o -L/alidata/server/mysql-5.6.15/lib -lmysqlclient -L../common/lib -lxdbc -lbase -lboost_thread -o test
../common/lib/libxdbc.a(connpool.o): In function `std::list<xConnection*, std::allocator<xConnection*>
>::_M_insert(std::_List_iterator<xConnection*>, xConnection* const&)':
/usr/gcc/include/c++/4.9.2/bits/stl_list.h:1681: undefined reference to
`std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
collect2: error: ld returned 1 exit status
make: *** [MAINTARGET] Error
mysql下载后安装中出现提示不到安装包
错误提⽰不到`std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)这个符号,原因是:gcc-4.9.2版本编译链接的时候,还是链接到/usr/lib⽬录下的旧的库(gcc-4.4.7所依赖的库的路径,⽽这个库或许做了改动,添加了内容,并且gcc-4.9.2需要使⽤到这些新内容,在旧的库不到新增的符号,是很正常的),导致出现不到符号的错误。我们在编译的时候遇到这类型错误,都可以尝试考虑⼀下是否是这个原因。在这⾥,解决这个问题,有两个⽅法。
1、到这个符号所在的库,在编译的时候明确使⽤它,这种⽅案有两个缺点,我们要到符号所在的库⽂件不容易,特别是⼀些不常见的符号;⼆是,以后还可能会遇到另外的符号不到的,⼜需要去库,在编译的时候指定。
2、仔细想想,既然gcc-4.9.2使⽤到了这个符号,那么它在安装的时候,是不是会连带着将这个新的库也安装了呢,⾮常有可能,赶紧去尝试⼀把,将gcc-4.9.2的lib⽬录,添加到LD_LIBRARY_PATH环境变量,顺便说下LD_LIBRARY_PATH环境变量的作⽤:编译器查库的顺序,是先到LD_LIBRARY_PATH环境变量指定的⽬录下去,不到之后再到系统默认⽬录(通过PATH环境变量指定)去,也就是说,即使我们在系统默认的⽬录下和我们通过LD_LIBRARY_PATH指定的⽬录下,存在同名的库,链接的时候是使⽤LD_LIBRARY_PATH 指定⽬录下的库⽽⾮系统默认⽬录的库,想要了解更多编译器查询库的顺序,可以⾃⾏去百度。
此处使⽤第⼆种⽅法,操作如下
在 .bash_profile⽂件(设置环境变量的⽂件,CentOS版的linux发布,其它版本的发布,名字或许不太⼀样)中加⼊以下内容,注意将gcc-4.9.2替换成你⾃⼰安装gcc-4.9.2版本的⽬录。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/gcc-4.9.2/lib:/usr/gcc-4.9.2/lib64
export LD_LIBRARY_PATH
这个⽅法通常可以⽤来解决编译时库的兼容性问题
保存并重启终端,make,编译成功。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。