在linux系统中使用Cmake,需要用到gcc编译器,但是centos7里的版本比较低。
而且在某些应用场景中,需要特定的gcc版本支持

但是轻易不要去编译gcc,以免出现更多不必要的问题。

推荐使用红帽提供的开发工具包( Developer Toolset )来管理gcc版本,这样做的好处是随时切换版本,并且可以并存多个版本,不会破坏原有gcc环境。

1
2
3
4
5
6
7
8
Developer Toolset 对应gcc的版本
devtoolset-3对应gcc4.x.x版本
devtoolset-4对应gcc5.x.x版本
devtoolset-6对应gcc6.x.x版本
devtoolset-7对应gcc7.x.x版本
devtoolset-8对应gcc8.x.x版本
devtoolset-9对应gcc9.x.x版本
devtoolset-10对应gcc10.x.x版本

检查当前 GCC 版本: 首先,你可以通过以下命令检查当前系统中安装的 GCC 版本:

1
2
3
4
5
6
7
8
[root@]# gcc --version
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install--with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)

一、问题原因
CentOS 7 的 SCL 软件源(centos-sclo-rh)已于 ‌2024年6月30日停止维护‌,原官方镜像地址 mirrorlist.centos.org 无法解析或访问‌12。

二、解决方案
1. ‌备份并禁用原 SCL 源‌
cd /etc/yum.repos.d/ 
mv CentOS-SCLo-scl.repo CentOS-SCLo-scl.repo.bak 
mv CentOS-SCLo-scl-rh.repo CentOS-SCLo-scl-rh.repo.bak
AI生成项目
说明:原 SCL 源已失效,需禁用以避免冲突‌。

2. ‌配置阿里云 SCL 源‌
‌手动创建或编辑配置文件‌:
vi CentOS-SCLo-rh.repo

‌添加以下内容‌:

1
2
3
4
5
6
[centos-sclo-rh]  
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

说明:将 baseurl 替换为阿里云镜像地址‌23。

3. ‌更新其他仓库地址‌
检查 /etc/yum.repos.d/ 目录下的其他仓库文件(如 CentOS-Base.repo),将 http://mirror.centos.org 替换为 https://mirrors.aliyun.com‌3。

4. ‌清理并重建 yum 缓存‌

1
2
yum clean all 
yum makecache

5. ‌验证操作‌
执行 yum update 或安装所需软件(如 gcc),确认不再报错‌13。

安装 gcc 9
安装较新的 GCC 版本: 启用 SCL 仓库后,你可以安装较新的 GCC 版本。例如,安装 GCC 9:

1
yum install devtoolset-9-gcc devtoolset-9-gcc-c++

注意:有可能安装其他版本会找不到对应的包
你可以根据需要选择其他版本的 GCC,例如 devtoolset-8 对应 GCC 8,devtoolset-10 对应 GCC 10,等等。

启用新版本的 GCC: 安装完成后,你需要启用新版本的 GCC。你可以通过以下命令启用:

1
scl enable devtoolset-9 bash

这个命令会在当前 shell 会话中启用 GCC 9。如果你希望每次登录时自动启用新版本的 GCC,可以将以下命令添加到你的 ~/.bashrc 文件中:

1
source /opt/rh/devtoolset-9/enable

版本验证
验证 GCC 版本: 最后,你可以再次检查 GCC 版本,确认升级是否成功:

1
2
3
4
5
6
7
8
9
[root@]# gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-9/root/usr --mandir=/opt/rh/devtoolset-9/root/usr/share/man --infodir=/opt/rh/devtoolset-9/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --with-default-libstdcxx-abi=gcc4-compatible --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-9.3.1-20200408/obj-x86_64-redhat-linux/isl-install --disable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC)

更新 libstdc++ 动态库
安装完成之后是还不能完全使用的,因为gcc动态库版本太老,还需要升级libstdc++.so.6才行。

1
2
3
4
5
6
# 更新lib libstdc++.so.6.0.26
wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26
# 替换系统中的/usr/lib64
把下载的libstdc++.so.6.0.26 cp 到 /usr/lib64/
cd /usr/lib64/
ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6

1、通过wget下载cmake版本

1
wget https://cmake.org/files/v3.21/cmake-3.21.0.tar.gz

2、解压

1
tar -zxvf cmake-3.21.0.tar.gz

3、进入cmake-3.21.0

1
2
3
4
​​​​​​​cd cmake-3.21.0

查看README.rst, 按照提示执行
./bootstrap && make && sudo make install

报错问题:
       1、提示bootstrap:行860: icc: 未找到命令,bootstrap:行860: tcc: 未找到命令      

1
2
3
4
sudo yum install gcc gcc-c++

export CC=/usr/bin/gcc
export CXX=/usr/bin/g++

       2、提示Could not find OpenSSL

1
2
3
4
5
6
7
8
sudo yum install openssl openssl-devel

openssl version

openssl version -a | grep OPENSSLDIR

export OPENSSL_ROOT_DIR=/usr/lib64/openssl # 或者根据实际路径调整
export OPENSSL_LIBRARIES=/usr/lib64/openssl

      3 、安装完成之后,执行cmake –version,提示-bash: /usr/bin/cmake: 没有那个文件或目录

1
2
3
4
5
6
7
8
ls /usr/local/bin/cmake

echo $PATH

export PATH=/usr/local/bin:$PATH

source ~/.bashrc # 如果修改的是 ~/.bashrc
source /etc/profile # 如果修改的是 /etc/profile