【系统软件01】devtoolset离线安装gcc
- 一、SCL简介
- 二、SCL源安装
- 三、离线下载devtoolset
- 1、Developer Toolset
- 2、下载devtoolset-9
- 3、压缩devtoolset-9
- 三、离线安装devtoolset-9(gcc9.3)
- 1、解压devtoolset-9.tar.gz
- 2、安装devtoolset-9
- 四、设置环境变量(使用gcc9.3)
- 1、当前窗口生效
- 2、当前用户永久生效
- 3、所有用户永久生效(重启系统生效)
- 4、验证
- 四、使用devtoolset安装gcc存在的问题
- 1、libc.so用的还是旧版本的——GLIBC还是旧版本的
- 2、libstdc++.so用的还是旧版本的——GLIBCXX还是旧版本的
- 3、libc++ 与 libstdc++ 是什么关系?
- 4、libc.so是什么
- 四、如何替换系统自带的gcc(不建议你这么做)
- 五、SCL常用软件集
- 六、SCL使用
- 七、建议使用devtoolset安装gcc?还是源码编译gcc?
一、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 7月 19 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常用软件集
- 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版本
- 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
- Go Toolset
Go Toolset是为CentOS和REHL Linux平台开发者设计的开发工具集,提供Golang编程语言库和工具。
yum install go-toolset-7
安装Go Toolset
- 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
- Redis软件集
Redis软件集有Redis3.2和Redis5.0两个版本,SCL名称分别为rh-redis32和rh-redis5。
yum install rh-redis5
安装rh-redis5
- 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使用
- SCL软件集查看
yum list all --enablerepo='centos-sclo-rh'
查询SCL支持的软件集合
- 查看已安装SCL软件集
scl --list
- 查询已安装SCL软件集
scl --list SCL_NAME
七、建议使用devtoolset安装gcc?还是源码编译gcc?
- 临时使用不同版本的gcc,建议devtoolset
- 长期项目使用gcc,建议源码编译安装gcc