CentOS 6.4服务器无root权限用户升级gcc过程

前言

最近要用GPU服务器算东西,但服务器里GCC的版本是4.4.7,不支持C++11特性,为了不修改自己的程序,选择升级服务器的GCC版本。由于我只有普通账户,没有sudo权限,而且服务器不连接外网,只能通过winscp上传安装包,升级起来很麻烦,这两天查了很多资料,也遇到了许多问题,好在今天终于搞好了,故记录一下,以备日后查看。PS. 希望以后不要出问题。

准备工作

  1. 下载自己需要的GCC文件,上传到服务器中
    我下载的是6.3.0版本,清华大学镜像网站

  2. 在服务器中解压GCC文件,进入解压目录查看编译所需依赖项并下载

    tar zxvf gcc-6.3.0.tar.gz	#解压命令
    cat ./contrib/download_prerequisites	#查看依赖项
    

    在这里插入图片描述

    依赖项下载地址:官方网站

    下载并上传到服务器后依次解压这四个压缩文件,我实际编译gcc的过程中没有使用isl,但还是列了出来

    tar jxvf gmp-4.3.2.tar.bz2
    tar jxvf mpfr-2.4.2.tar.bz2
    tar zxvf mpc-0.8.1.tar.gz
    tar jxvf isl-0.15.tar.bz2
    
  3. 安装依赖项
    我最开始按照[2][3]里的方法安装依赖项,在GCC的make过程中会报错,显示没有以上三个依赖项,后来用[1]中的方法成功了,现在具体介绍。

    上述三个依赖项必须按照顺序gmp->mpfr->mpc的顺序依次安装,安装时注意指定安装路径,这三个依赖项执行安装命令时都在相应解压后的目录中进行:

    ./configure --prefix=/home/user/gcc/my-gmp-4.3.2/ && make && make install
    ./configure --prefix=/home/user/gcc/my-mpfr_2.4.2/ --with-gmp=/home/user/gcc/my-gmp-4.3.2/ && make && make install
    ./configure --prefix=/home/user/gcc/my-mpc_0.8.1/ --with-gmp=/home/user/gcc/my-gmp-4.3.2/ --with-mpfr=/home/user/gcc/my-mpfr_2.4.2/ && make && make install
    ./configure --prefix=/user/gcc/my-isl-0.15/ && make && make install
    
  4. 添加依赖项的环境变量

    export LD_LIBRARY_PATH=:/home/user/gcc/my-mpc-0.8.1/lib:/home/user/gcc/my-gmp-4.3.2/lib:/home/user/gcc/my-mpfr-2.4.2/lib/:$LD_LIBRARY_PATH
    

安装GCC

  1. 生成makefile
    进入gcc解压后的目录

    ./configure --prefix=/home/user/gcc/my-gcc_6.3.0/ --enable-threads=posix --disable-checking --enable-language=c,c++ --disable-multilib --with-gmp=/home/user/gcc/my-gmp-4.3.2/ --with-mpfr=/home/user/gcc/my-mpfr_2.4.2/ --with-mpc=/home/user/gcc/my-mpc_0.8.1/
    
  2. 编译

    make -j4	#在多核CPU上并行编译,提高编译速度
    

    如果执行失败,直接使用make进行编译。我make -j4大概花了一个小时。

  3. 安装

    make install
    

    大概一个小时

  4. 修改用户环境变量
    打开配置文件

    vi ~/.bashrc
    

    在文档中添加

    export PATH=/home/user/gcc/my-gcc-6.3.0/bin:/home/user/gcc/my-gcc-6.3.0/lib64:$PATH
    export LD_LIBRARY_PATH=/home/user/gcc/my-gcc-6.3.0/lib/:/home/user/gcc/my-gcc-6.3.0/lib64/:/home/user/gcc/my-mpc-0.8.1/lib:/home/user/gcc/my-gmp-4.3.2/lib:/home/user/gcc/my-mpfr-2.4.2/lib/:$LD_LIBRARY_PATH
    

    保存后source一下

    source ~/.bashrc
    

    按照[1]中的说法

    一定把新的gcc目录的bin、lib64放在$PATH的前面,这样调用gcc会优先找到我们的新的gcc,而不是系统目录的旧gcc
    另外运行时库的环境变量LD_LIBRARY_PATH也一定要改,方式也是一定放在原先变量$LD_LIBRARY_PATH前面

    现在运行

    gcc -v
    g++ -v
    which gcc
    which g++
    

    应该可以看到新安装的GCC版本号,以及你的GCC安装路径了。

注意事项

  1. 因为我不是管理员,没有权限在系统目录下安装,所以上述所有软件的安装路径都在/home/user/目录下,安装时必须要指定安装路径,否则就会安装到默认的系统目录下而显示权限不足。

  2. /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found问题

    这个问题网上的教程很多,我看了好些,还查了Google,解决方法很多,看的我眼花撩换的。

    但是我刚安装好gcc时运行编译好的文件可以正常运行,后来再运行时才显示这个报错。所以我就在环境变量中把新版gcc目录中libstdc++.so.6所在路径加了进去,然后再运行程序时果然没报错了。这一项就是下图中的这一句:
    在这里插入图片描述
    使用ldd命令查看程序的所依赖的共享库列表

    ldd a.out
    

    看到现在程序依赖的是新版的库文件了

    linux-vdso.so.1 =>  (0x00007fff9d9ff000)
    libstdc++.so.6 => /home/user/gcc/my-gcc-6.3.0/lib64/libstdc++.so.6 (0x00002ab1ff6dd000)
    libm.so.6 => /lib64/libm.so.6 (0x00002ab1ffaa5000)
    libgcc_s.so.1 => /home/user/gcc/my-gcc-6.3.0/lib64/libgcc_s.so.1 (0x00002ab1ffd29000)
    libc.so.6 => /lib64/libc.so.6 (0x00002ab1fff3f000)
    /lib64/ld-linux-x86-64.so.2 (0x00002ab1ff4bb000)
    

    可以使用如下命令查看系统GLIBC版本

    strings /usr/lib64/libstdc++.so.6 | grep GLIBC
    

    在这里插入图片描述
    果然没有GLIBC_3.4.21版本,查看新安装GCC目录中GLIBC版本

    strings /home/user/gcc/my-gcc-6.3.0/lib64/libstdc++.so.6 | grep GLIBC
    

    在这里插入图片描述

    看到有GLIBC_3.4.21版本。

    另外,博客[1]提供了在报错的情况下通过修改makefile来编译程序的方法。

参考博客

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值