升级到gcc8 --编译安装
gcc镜像地址:https://mirrors.aliyun.com/gnu/gcc/
wget https://mirrors.aliyun.com/gnu/gcc/gcc-8.5.0/gcc-8.5.0.tar.gz?spm=a2c6h.25603864.0.0.3a156de2FgRJMV
tar zxvf gcc-8.5.0.tar.gz
cd gcc-8.5.0/
./contrib/download_prerequisites
#下载依赖,等待一段时间,显示All prerequisites downloaded successfully.表示成功
./configure --prefix=/data/fairseq/gcc-8.5.0 -enable-threads=posix -disable-checking -disable-multilib -enable-languages=c,c++
#生成Makefile文件,其中--prefix为gcc安装的路径需要更改
make -j4 #开始编译,-j为线程数,一般可设置为20,编译时间很长
make install
设置环境变量
vim ~/.bashrc
export GCC=/data/fairseq/gcc-8.5.0
export PATH=${GCC}/bin:$PATH
export LD_LIBRARY_PATH=${GCC}/lib64:$LD_LIBRARY_PATH
export LIBRARY_PATH=${GCC}/lib:$LIBRARY_PATH
export C_INCLUDE_PATH=${GCC}/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=${GCC}/include:$CPLUS_INCLUDE_PATH
注意:GCC=/data/fairseq/gcc-8.5.0为gcc安装目录需要修改
使环境变量生效:
source ~/.bashrc
替换动态库
检查动态库:
strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
输出如下:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
...
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH
的确没有 GLIBCXX_3.4.29,GCC 的动态库还是旧版本的,编译升级 GCC 时生成的新版本动态库没有替换老版本的。
执行以下命令,查找编译 GCC 时生成的新动态库:
sudo find /usr/ -name "libstdc++.so*"
输出如下:
/usr/lib64/libstdc++.so.6.0.29
/usr/lib32/libstdc++.so.6
/usr/lib32/libstdc++.so.6.0.28
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.29
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6.0.29-gdb.py
...
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
...
最新版本为 libstdc++.so.6.0.29,而 /usr/lib/x86_64-linux-gnu/ 路径下的版本为 6.0.28 ,这就是问题所在了。将新版本复制过去并重新链接即可。
sudo cp /usr/local/lib64/libstdc++.so.6.0.29 /lib/x86_64-linux-gnu/ # 复制新版本
cd /lib/x86_64-linux-gnu # 进入该目录
sudo rm ./libstdc++.so.6 # 删除原有的默认库的软链接
sudo mv libstdc++.so.6.0.28 ./libstdc++.so.6.0.28.backup # 保险起见,备份原文件
sudo ln -s ./libstdc++.so.6.0.29 libstdc++.so.6 # 建立新的软链接
至此,默认动态库升级完成。再次运行一下命令检查动态库:
strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
现在输出如下:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
...
GLIBCXX_3.4.28
GLIBCXX_3.4.29
...
至此,问题就解决了,a.out 可以正常运行了。
gcc版本临时升级–便捷方法
问题提出:
虚拟机下面安装的centos7系统,默认gcc是4.8.5版本。
想升级到最新版本,但是又不想花很多时间去编译源码。有没有一种更加便捷的升级方法呢?
升级步骤:
1.安装 scl仓库
SCL(Software Collections)可以让你在同一个操作系统上安装和使用多个版本的软件,而不会影响整个系统的安装包。
sudo yum install centos-release-scl -y
centos7中安装了centos-release-scl后,之前的yum源变为不可用 解决方案,检查并修复 SCL 仓库配置
ls -l /etc/yum.repos.d/CentOS-SCLo*
cat > /etc/yum.repos.d/CentOS-SCLo-scl.repo <<'EOF'
[centos-sclo-scl]
name=CentOS-7 - SCLo scl
baseurl=https://mirrors.aliyun.com/centos/7/sclo/$basearch/sclo/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-scl-rh]
name=CentOS-7 - SCLo scl-rh
baseurl=https://mirrors.aliyun.com/centos/7/sclo/$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
EOF
2.安装所需版本的GCC:
yum install devtoolset-9-gcc devtoolset-9-gcc-c++ -y
3.启用devtoolset版本的gcc:
scl enable devtoolset-9 bash #临时生效
注意: scl enable devtoolset-11 bash命令仅是临时性的使新的gcc生效,直到会话结束。
4.验证GCC版本:
gcc --version
g++ --version
c++ --version
5.为了使新版本的GCC在重新启动后仍然保持为默认版本,你可以将启用命令添加到你的shell配置文件。编辑 ~/.bashrc 文件,添加以下行:
echo "source /opt/rh/devtoolset-9/enable" >> ~/.bashrc
保存文件并重新加载配置:
source ~/.bashrc
现在,你已成功升级到最新版本的GCC,并且它会在重新启动系统后仍然保持升级状态。这个方法使用了SCL仓库,允许你同时安装多个版本的软件,非常方便。如果你需要升级到其他版本的GCC,只需更改命令中的版本号即可。
升级到 gcc11
yum install git gcc gcc-c++ -y
# 升级 gcc
sudo yum install centos-release-scl
sudo yum install devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils -y
scl enable devtoolset-11 bash
echo "source /opt/rh/devtoolset-9/enable" >> ~/.bashrc #永久生效
5035

被折叠的 条评论
为什么被折叠?



