记录一次centos7 升级gcc 和glibc处理经历和错误处理方法(默认4.8.5 升级到7.5.0)

ImportError: libSM.so.6: cannot open shared object file: No such file or directory
sudo yum install libXext libSM libXrender

//安装bzip2
yum -y install bzip2
//升级gcc
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.bz2
tar -xvf gcc-7.1.0.tar.bz2
cd gcc-7.1.0/
sudo ./contrib/download_prerequisites
sudo mkdir build
cd build
sudo ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --prefix=/usr/local/gcc-7.1.0
sudo make -j8
sudo make install -j8
安装完成后
  sudo ln -s /usr/local/gcc-7.1.0/bin/gcc /usr/bin/gcc
 sudo ln -s /usr/local/gcc-7.1.0/bin/g++ /usr/bin/g++
如果已经存在则删除
rm -rf /usr/bin/gcc
rm -rf /usr/bin/g++

关联lib64
export LD_LIBRARY_PATH=/usr/local/gcc-7.1.0/lib64

查看
strings /usr/local/gcc-7.1.0/lib64/libstdc++.so.6 |grep 'CXXABI'


centos7 xgcc: error trying to exec 'cc1plus': execvp: No such file or directory
//对于这个问题造成的原因很多
 第一:查询gcc -v 和g++ -v 版本不一致
 第二种:gcc 和g++ 版本一致
    对于这个的情况,可能是你在之前升级过gcc版本,表面看起来是一致的,但是你的系统里面有的地方还是使用默认的gcc
    解决的办法:
     在/etc/profile 里面把cclplus地址放到环境变量中


     
出现/lib64/libm.so.6: version `GLIBC_2.23' not found  错误
1.wget https://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz
2.tar xf      glibc-2.23.tar.gz
3.mkdir build 
4.cd build
5. ../configure --prefix=/usr/local/glibc-2.23
6.建立软连接
   mv /lib64/libm.so.6 /lib64/libm.so.6.bak
   ln -s /root/glibc-2.23/build/math/libm.so.6 /lib64/libm.so.6 
7.测试
     strings /lib64/libc.so.6 |grep GLIBC_
     
     
//错误处理
//glibc-2.23\stdlib\setenv.c
setenv.c: In function ‘__unsetenv’:
setenv.c:279:6: error: suggest explicit braces to avoid ambiguous ‘else’ [-Werror=dangling-else]
   if (ep != NULL)
   
 在源码中,找到setenv.c 文件,在279 加上{}就可以了  
 
 
 //glibc-2.23\sysdeps\ieee754\dbl-64\e_pow.c
 error: ‘<<’ in boolean context, did you mean ‘<’ ? [-Werror=int-in-bool-

 在源码中,找到e_pow.c 修改如下
 
 if (n << (k - 20)!=0)
 
 (n << (k - 21)!=0) ? -1 : 1;
 
 (m << (k + 12)!=0)
 
 (m << (k + 11)!=0) ? -1 : 1;
 
 
 
 //glic-2.23/sunrpc/rpc_parse.c
 rpc_parse.c: In function ‘get_prog_declaration’:
rpc_parse.c:543:23: error: ‘%d’ directive writing between 1 and 10 bytes into a region of size 7 [-Werror=format-overflow=]
     sprintf (name, "%s%d", ARGNAME, num); /* default name of argument */
                       ^~
rpc_parse.c:543:20: note: directive argument in the range [1, 2147483647]
     sprintf (name, "%s%d", ARGNAME, num); /* default name of argument */
                    ^~~~~~
rpc_parse.c:543:5: note: ‘sprintf’ output between 5 and 14 bytes into a destination of size 10
     sprintf (name, "%s%d", ARGNAME, num); /* default name of argument */
     
    修改成:sprintf (name, "%s%d", ARGNAME, (short)num)
    
//glibc-2.23\nis\nis_call.c
nis_call.c: In function ‘nis_server_cache_add’:
nis_call.c:682:6: error: suggest explicit braces to avoid ambiguous ‘else’ [-Werror=dangling-else]
   if (*loc != NULL)
      ^
cc1: all warnings being treated as errors
 改成这样:
   if (*loc != NULL){
    for (i = 1; i < 16; ++i)
      if (nis_server_cache[i] == NULL)
    {
      loc = &nis_server_cache[i];
      break;
    }
      else if ((*loc)->uses > nis_server_cache[i]->uses
           || ((*loc)->uses == nis_server_cache[i]->uses
           && (*loc)->expires > nis_server_cache[i]->expires))
    loc = &nis_server_cache[i];
  }
     

libc 软连接连接之后发生所有命令都无法运行,还原的方法
1.切换到/lib64/libc.so.6 看文件是否存在
2.如果存在,修改名字,因为这个时候,所有命令都失效了,所以可以使用
    LD_PRELOAD=/lib64/libc-2.17.so mv libc.so.6 libc.so.6.bak
3.再使用 下面命令就可以还原了,每个人的系统版本可能不一样,我是centos7 你们自己可以去下面目录看看
  LD_PRELOAD=/lib64/libc-2.17.so ln -s /lib64/libc-2.17.so  /lib64/libc.so.6

    

你可能感兴趣的:(gcc升级,gblic升级)