centos下安装gcc-4.8.1

时代变更很快,也许 u 的 linux 内核版本还长期维护在 2.6.x,然而实际最新的稳定版本已经到了 3.9.4,gcc 版本恐怕很多人也如此。默认安装的 gcc 版本恐怕在 4.4.x 附近,实际上 gcc 4.8.1 已经出来了,gcc 4.9.0 也已经在开发中,O__O"…。升级 gcc 的主要原因可能不是性能的问题,而是为了支持最新的 c++ 标准 —— c++11;实际上 4.7.1 已经支持的不少勒,4.8.0 几乎全部支持,4.8.1 貌似除了“最小化的垃圾回收器和基于可达的内存泄漏检测”之外,其他的都已经支持,具体的可以看下官方的说明

gcc 是 linux 上的一个重要的工具,因为 linux 上的所有源码安装都需要使用 gcc。而源码安装 gcc 也需要 gcc 支持,这让人赶脚有点诡异,O__O"…。linux 下所有源码安装都是三步:(1) ./configure (2) make (3) make install 。第一步检测软件安装的环境以及生成 makefile 文件,关于安装目录的设置也在这一步;第二步是编译,源码安装的大部分时间可能花在这里(maybe 是包的依赖?);第三步就是将文件 install (安装?拷贝?) 到指定的目录下。gcc 的安装当然也不过如此,然而有几个问题可能会出现:

  1. 通常的 ./configure+make+make install 都在 srcdir (源文件目录)下操作,实际上,gcc 的安装可以这样,但是还是不要这样(官方也不推荐),因为如果安装失败(这是很有可能的),那么源文件和生成的文件完全搅在一起,如果想重新编译的话,貌似是件麻烦的事;所以,新建一个 objdir (不能是 srcdir 的子目录),然后在 objdir 下操作;
  2. 编译 gcc 需要很多工具(库)的支持:GMP、MPFR、MPC、ISL、CLooG;具体是干神马用的,不用关心,但是如果系统上没有装的话,这玩意得得一一安装;(不过使用的系统上也可能都安装了)
  3. 上面依赖的 lib 安装后也不一定能顺利编译 gcc,可能需要配置一些环境变量;在 ./configure 这一步检查 log 文件,checking 部分都 yes,而且没有 error 的话,就可以 make 了;
  4. 还有一个问题是,这可能是 gcc 的 bug:在 64 位系统上编译 gcc,编译的时候可能提示找不到 stubs-32.h 这个文件,u 需要安装 glibc-devel 的 32 位版本,比如 glibc-devel.i686 (gligc-devel.x86_64 是 64 位版本);
  5. 通常 ./configure 的时候,me 们都是用默认配置,这里貌似最好不要,至少 me 没有选择默认配置,主要原因是怕安装失败造成原有 gcc 不能用,O__O"…
  6. 如果安装成功的话,剩下的问题就是替换掉原有的 gcc 命令以及修改 include 和 lib 的搜索路径;

上面的说法有些危言耸听,linux 发行版很多,同一个发行版也有很多版本,不能说 me 上面曾经没有的软件包,u 上面也没有,所以上面的只算是提供了一些如果编译出现问题可以参考的解决思路而已,O__O"…。

源码安装 gcc

假设在当前目录下有 gcc-4.8.1.tar.bz2 包。

# 解压缩
$ tar jxvf gcc-4.8.1.tar.bz2 # 如果是 .tar.gz 的话,使用 tar -zxvf gcc-4.8.1.tar.gz;

# 创建目录:编译目录和安装目录
$ mkdir objdir
$ mkdir /usr/local/gcc-4.8.1
$ mkdir /usr/local/gcc

# 配置:选择安装目录以及编译的语言
$ cd objdir
$ ../gcc-4.8.1/configure   --prefix=/usr/local/gcc-4.8.1 --exec-prefix=/usr/local/gcc --enable-languages=c,c++

# 编译
$ make # 如果 u 的 cpu 是四核的话,可以 make -j4 加速编译

# 安装
$ make install # 可能需要管理员权限

make install 之后,会发现 /user/local/gcc 下放置的是 bin + lib 文件,/usr/local/gcc-4.8.1 下放置的是 include 文件。上面完事之后,就是删除原有的 gcc,替换成现在的最新版本;不过为了保险起见,还是将原有的 gcc 换成其他名字的好,比如 gcc-4.4.7/g++-4.4.7。关于后续的工作其实还有一些,主要是环境变量的设置,以及为 c++ 做的一些设置。

# 将 gcc/g++ 改名
$ mv /usr/bin/gcc /usr/bin/gcc-4.4.7
$ mv /usr/bin/g++ /usr/bin/g++-4.4.7

# 环境变量的设置
$ export PATH=/usr/local/gcc/bin:$PATH # 可以让 us 使用最新的 gcc/g++;
$ export LD_LIBRARY_PATH=/usr/local/lib # 这个可能不是必须的,对于 me 来说是必须的,设置的是 lib  的搜索 path;
$ ln -s /usr/local/gcc-4.8.1/include/c++/4.8.1 /usr/include/c++/4.8.1 # 在 include/c++ 文件夹下添加最新的 c++ 4.8.1 版本(这是个符号链接);
$ export C_INCLUDE_PATH=/usr/include # 这个是多余的,实际上不用设置;
$ export CPLUS_INCLUDE_PATH=/usr/include/c++/4.8.1:/usr/include/c++/4.8.1/x86_64-unknown-linux-gnu # c++ include 搜索目录,这里有两个,使用的 : 隔开;

有个问题是,在 shell 中通过 export 设置的环境变量不是持久有效的,在用户退出登录之后就不再有效,可以将 export 的环境变量在用户主目录下的 .bash_profile 中设置,对用户来说,是持久有效的;如果想对对所有的用户有效,需要 root 在 /etc/profile 中设置

安装可能出现的问题以及方案

  1. configure 步骤提示找不到 gmp、mpfr 等 lib 或是 header;缺少的要安装,可以使用自带的包管理器,比如 yum install gmp,也可以从官网下载安装,下载地址:
  2. ISL 明明已经安装了,然而 configure 检测 no !设置环境变量 $ export LD_LIBRARY_PATH=/usr/local/lib (这是 isl lib 所在的目录,当然 u 的可能不一样);
  3. stubs-32.h 找不到,安装 32 位的 glibc-devel;
  4. 编译 c++ 发现找不到 c++config.h;本来 c++ include 目录是 /usr/include/c++/4.8.1,c++config.h 位于其下的 x86_64-unknown-linux-gnu (这个文件夹跟平台有关)下,所以可以在 CPLUS_INCLUDE_PATH 中设置;
  5. 环境变量设置只在 shell 中有效,退出之后就不再有效;修改 ~/.bash_profile 文件,在其中添加环境变量(需要退出登陆有效);

测试

编译一下 hello.cpp,使用了 c++11 的一些特性,比如初始化方式,类型推断以及新的 for 用法,$ g++ -std=c++11 hello.cpp :

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.         vector<int> v = {2, 4, 8, 3, 5, 6, 1, 7, 10, 9};
  9.  
  10.         sort(v.begin(), v.end());
  11.  
  12.         for(auto i: v)
  13.                 cout << i << " ";
  14.         cout << endl;
  15.  
  16.         return 0;
  17. }

希望一切顺利,~~~~(>_<)~~~~

Tags: 

Article type: