一、SCL简介

SCL(Software Collections)是一个CentOS/RHEL Linux平台的软件多版本共存解决方案,为RHEL/CentOS Linux用户提供一种方便、安全地安装和使用应用程序和运行时环境的多个版本的方式,同时避免把系统搞乱。

参考:
1、Linux开发环境——SCL软件集
2、转载:Centos7安装SCL源
3、CentOS 使用 IUS / SCL 第三方软件源
4、为CentOS 6、7升级gcc至4.8、4.9、5.2、6.3、7.3等高版本

二、SCL源安装

  • 1、SCL源安装
yum -y install centos-release-scl
  • 2、查看安装的scl源
[root@localhost ~]# cd /etc/yum.repos.d
[root@localhost yum.repos.d]# ls
CentOS-Base.repo       CentOS-Media.repo        CentOS-Vault.repo
CentOS-CR.repo         CentOS-SCLo-scl.repo     CentOS-x86_64-kernel.repo
CentOS-Debuginfo.repo  CentOS-SCLo-scl-rh.repo
CentOS-fasttrack.repo  CentOS-Sources.repo
[root@localhost yum.repos.d]# 

三、离线下载devtoolset

1、Developer Toolset

Developer Toolset是为CentOS和REHL Linux平台开发者设计的开发工具集,提供GCC工具集、GNU Debugger以及其它开发、调试、性能测试工具的不同版本。

  • Developer Toolset 3、Developer Toolset 4、Developer Toolset 6已经废弃。

  • 从上面的镜像源中我们可以看到,目前维护的版本是:Developer Toolset 7、Developer Toolset 8、Developer Toolset 9、Developer Toolset 10、Developer Toolset 11

  • Developer Toolset 7 - Developer Toolset 11,分别对应gcc7-gcc11

我们下面以安装gcc9.3为例,其他可维护的版本与此相同。

2、下载devtoolset-9

下载devtoolset-9,也就是gcc9.3版本

yum -y install --downloadonly --downloaddir=devtoolset-9  devtoolset-9

or

yum -y install --downloadonly --downloaddir=devtoolset-9 devtoolset-9-*

or

yum -y install --downloadonly --downloaddir=devtoolset-9 devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils 

–downloadonly表示仅仅下载
–downloaddir=devtoolset-9表示下载目录的文件夹名字是devtoolset-9

备注:下载devtoolset-9的机器,必须和不联网的机器使用的centos系统相同。否则离线安装的过程可以会出现失败。

3、压缩devtoolset-9

tar -czvf devtoolset-9.tar.gz devtoolset-9

在这里插入图片描述

三、离线安装devtoolset-9(gcc9.3)

把devtoolset-9.tar.gz拷贝到不联网的电脑。

1、解压devtoolset-9.tar.gz

tar -xzvf devtoolset-9.tar.gz

2、安装devtoolset-9

进入解压的devtoolset-9,安装devtoolset-9

cd devtoolset-9
rpm -Uvh *.rpm

四、设置环境变量(使用gcc9.3)

1、当前窗口生效

scl enable devtoolset-9 bash

or

source /opt/rh/devtoolset-9/enable

以上只有在当前窗口生效,在其他窗口无效。

2、当前用户永久生效

在~/.profile末尾假如以下1行

source /opt/rh/devtoolset-9/enable

3、所有用户永久生效(重启系统生效)

  • 方法一:(重启系统生效)
    打开/etc/profile.d/devtoolset.sh 文件:
    把以下内容加入文件

cd /etc/profile.d
vi devtoolset.sh

source /opt/rh/devtoolset-9/enable
  • 方法二:(重启系统生效)
    在/etc/profile文件末尾加入以下1行

cd /etc
vi profile

source /opt/rh/devtoolset-9/enable
  • 方法三:命令行执行(重启系统生效)
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

4、验证

which gcc
gcc -v

在这里插入图片描述

四、使用devtoolset安装gcc存在的问题

1、libc.so用的还是旧版本的——GLIBC还是旧版本的

  • 查找libc.so*
[root@localhost ~]# find / -name libc.so*
/usr/lib/x86_64-redhat-linux6E/lib64/libc.so
/usr/lib64/libc.so.6
/usr/lib64/libc.so
/opt/rh/devtoolset-9/root/usr/share/ltrace/libc.so.conf
[root@localhost ~]
  • 查看系统自带的libc.so.6
    发现最新的是GLIBC_2.17
[root@localhost ~]# ls -l /usr/lib64/libc.so.6
lrwxrwxrwx. 1 root root 12 Jun 25 09:41 /usr/lib64/libc.so.6 -> libc-2.17.so
[root@localhost ~]# strings /usr/lib64/libc.so.6 |grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE
___sys_nerr_GLIBC_2_3
___sys_nerr_GLIBC_2_4
___sys_nerr_GLIBC_2_1
  • 如何使用高版本的GLIBC?
    既然devtool并不会升级GLIBC,如果我们需要使用高版本的GLIBC怎么办?
    解决方案:源码编译glibc对应版本,然后创建软连接。——具体可以参考我之前写的博客

2、libstdc++.so用的还是旧版本的——GLIBCXX还是旧版本的

  • 查找系统中的libstdc++.so
[root@localhost dev1]# find / -name libstdc++.so*
/home/dev1/vmware-tools-distrib/lib/lib64/libstdc++.so.6
/home/dev1/vmware-tools-distrib/lib/lib64/libstdc++.so.6/libstdc++.so.6
/home/dev1/vmware-tools-distrib/lib/lib32/libstdc++.so.6
/home/dev1/vmware-tools-distrib/lib/lib32/libstdc++.so.6/libstdc++.so.6
find: ‘/run/user/1000/gvfs’: 权限不够
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib/vmware-tools/lib64/libstdc++.so.6
/usr/lib/vmware-tools/lib64/libstdc++.so.6/libstdc++.so.6
/usr/lib/vmware-tools/lib32/libstdc++.so.6
/usr/lib/vmware-tools/lib32/libstdc++.so.6/libstdc++.so.6
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++.so
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so
/opt/rh/devtoolset-9/root/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.py
/opt/rh/devtoolset-9/root/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.pyc
/opt/rh/devtoolset-9/root/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.pyo
/opt/rh/devtoolset-9/root/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/opt/rh/devtoolset-9/root/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/opt/rh/devtoolset-9/root/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
[root@localhost dev1]
  • 查看系统自带的libstdc++.so.6
    发现使用devtool安装后,libstdc++依然是系统原有的GLIBCXX_3.4.19

[root@localhost dev1]# ls -l /usr/lib64/libstdc++.so.6
lrwxrwxrwx. 1 root root 19 719 2021 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
[root@localhost dev1]# strings /usr/lib64/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.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH
[root@localhost dev1]# 
  • 如果要使用高版本的GLIBCXX怎么办?
    解决方案:源码方式编译gcc,因为源码编译安装gcc的方式,会自带高版本的GLIBCXX,也就是高版本的libstdc++。

3、libc++ 与 libstdc++ 是什么关系?

libc++和libstdc++都是C++标准库的实现,两者都提供了相同的C++标准库功能,包括容器、算法、迭代器、输入输出等等。但是,它们是由不同的团队开发并维护的,也有着不同的设计理念和实现方式。本文将详细介绍这两个库的特点和区别,以及它们之间的关系。

首先,让我们来了解一下libc++和libstdc++的基本情况。libc++是由苹果公司开发和维护的C++标准库实现,旨在提供一个更加现代化和高效的C++标准库。它的设计理念是利用C++11和C++14中的新特性,尽可能地避免使用C++03中的一些问题和不足之处。libc++使用了更加现代化的编程风格和技术,比如使用C++11中的move语义和智能指针等等。libc++在macOS、iOS、watchOS等苹果生态系统中被广泛使用。

而libstdc++则是由GNU项目组开发和维护的C++标准库实现,也是GCC编译器的默认标准库。它的设计理念是充分利用C++03中的特性,尽可能地支持标准C++03规范。libstdc++的实现方式和设计思路与libc++有所不同,比如它更多地使用了指针和传统的C++语言特性。

参考​libc++ 与 libstdc++ 是什么关系?

4、libc.so是什么

libc.so 是 Linux 系统中的 C标准库(C standard library)的动态链接库文件。它是C语言程序开发中的核心库之一,提供了许多常用的函数和工具,用于实现各种基本的操作,如字符串处理、内存分配、文件操作等。

C标准库包含在应用程序开发中经常使用的函数,这些函数已经被编写好并进行了优化,可以方便地在应用程序中调用。libc.so 动态链接库在程序运行时加载到内存中,并提供了这些函数的实现。

常见的一些 libc.so 函数包括:
字符串操作函数:如 strcpy、strcat、strlen 等。
内存分配函数:如 malloc、free、calloc 等。
文件操作函数:如 fopen、fclose、fwrite、fread 等。
时间和日期函数:如 time、strftime 等。
数学函数:如 sin、cos、sqrt 等。
通过使用 libc.so 提供的这些函数,开发者可以更加高效地编写应用程序,并利用标准库的功能来简化开发过程。

值得注意的是,动态链接库的名称可能因操作系统和版本而异。在某些系统上,libc.so 可能被称为 libc.so.6 或其他类似的名称,其中的数字表示库的版本。这些库文件通常位于系统的标准库路径下,开发者可以通过链接器将它们与应用程序进行关联,以便在运行时调用库中提供的函数。

四、如何替换系统自带的gcc(不建议你这么做)

截止目前,系统有两个gcc,一个系统自带的gcc4.8.5,另外一个就是我们刚刚安装配置的gcc9.3了,是否有办法把系统自带的gcc4.8替换成高版本的gcc9.3呢,答案是可以的。方案就是,把原有的gcc备份,并建立新的软链接。

  • 把系统原有的gcc、g++、c++备份
cd usr/bin
mv gcc gcc.bak
mv g++ g++.bak
mv c++ c++.bak
mv cc cc.bak
mv cpp cpp.bak
mv gcc-nm gcc-nm.bak
mv gcc-ar gcc-ar.bak
mv gcc-ranlib gcc-ranlib.bak
  • 建立软链接gcc、g++、c++
ln -sv /opt/rh/devtoolset-9/root/usr/bin/gcc /usr/bin/gcc
ln -sv /opt/rh/devtoolset-9/root/usr/bin/g++ /usr/bin/g++
ln -sv /opt/rh/devtoolset-9/root/usr/bin/c++ /usr/bin/c++
ln -sv /opt/rh/devtoolset-9/root/usr/bin/cc /usr/bin/cc
ln -sv /opt/rh/devtoolset-9/root/usr/bin/cpp /usr/bin/cpp
ln -sv /opt/rh/devtoolset-9/root/usr/bin/gcc-nm /usr/bin/gcc-nm
ln -sv /opt/rh/devtoolset-9/root/usr/bin/gcc-ar /usr/bin/gcc-ar
ln -sv /opt/rh/devtoolset-9/root/usr/bin/gcc-ranlib/usr/bin/gcc-ranlib

五、SCL常用软件集

  1. Developer Toolset

Developer Toolset是为CentOS和REHL Linux平台开发者设计的开发工具集,提供GCC工具集、GNU Debugger以及其它开发、调试、性能测试工具的不同版本。

Developer Toolset 3、Developer Toolset 4、Developer Toolset 6已经废弃。

Developer Toolset 7对应GCC 7版本

yum install devtoolset-7

Developer Toolset 8对应GCC 8版本

  1. Clang and LLVM Toolset

Clang and LLVM Toolset是为CentOS和REHL Linux平台开发者设计的开发工具集,提供LLVM编译器基础设施、C/C++语言Clang编译器、LLDB调试器、代码分析相关工具。

yum install llvm-toolset-7.0

安装Clang and LLVM Toolset

  1. Go Toolset

Go Toolset是为CentOS和REHL Linux平台开发者设计的开发工具集,提供Golang编程语言库和工具。

yum install go-toolset-7

安装Go Toolset

  1. Python软件集

SCL中,Python软件集包括Python27、Python33、Python34、Python35、Python36五个版本,相应的SCL软件集名称为python27、python33、rh-python34、rh-python35、rh-python36。

rh-python36包含Python3.6解释器、Web编程扩展库、mod_wsgi、PostgreSQL数据库接口库、numpy、scipy。

yum install rh-python36

安装rh-python36

  1. Redis软件集

Redis软件集有Redis3.2和Redis5.0两个版本,SCL名称分别为rh-redis32和rh-redis5。

yum install rh-redis5

安装rh-redis5

  1. MySQL

MySQL软件集有MySQL5.5、MySQL5.6、MySQL5.7、MySQL8.0四个版本,SCL名称分别为rh-mysql55、rh-mysql56、rh-mysql57、rh-mysql80。

yum install rh-mysql80

安装rh-mysql80

六、SCL使用

  1. SCL软件集查看
yum list all --enablerepo='centos-sclo-rh'

查询SCL支持的软件集合

  1. 查看已安装SCL软件集
scl --list
  1. 查询已安装SCL软件集
scl --list SCL_NAME

七、建议使用devtoolset安装gcc?还是源码编译gcc?

  • 临时使用不同版本的gcc,建议devtoolset
  • 长期项目使用gcc,建议源码编译安装gcc
Logo

更多推荐