银河麒麟V10 SP3安装gcc-toolset-10:yum仓库配置与避坑指南 📅 发布时间:2026/9/17 13:03:38 👁 浏览次数: 写这篇东西之前我先把话说在前面银河麒麟V10 SP3不是拿CentOS的安装包随便一套就能用的系统。很多朋友一上来就顺手把CentOS的源替换进去结果404、依赖冲突、GPG报错轮着来最后系统整得半死不活。这篇文章我结合自己在x86_64和aarch64两种架构上的实操经历把gcc-toolset-10的安装思路、yum仓库配置的底层逻辑、以及最容易翻车的几个坑完整捋一遍。整个过程不碰系统自带的编译器只在独立目录里激活GCC 10环境生产环境也能这么干。1. 为什么首选gcc-toolset-10而不是自己编译GCC1.1 聊清楚gcc-toolset-10到底是什么简单来说gcc-toolset-10是RH系Linux发行版提供的一套“软件集合”Software Collection它把GCC 10系列编译器、GDB调试器、binutils工具链等打包到独立的目录/opt/rh/gcc-toolset-10/下面。和系统默认编译器完全不同它不覆盖、不替换/usr/bin/gcc而是通过一个环境变量脚本让你“切换”过去使用。这样做的好处非常明显系统的其他软件仍然依赖系统自带的GCC 8.x不受影响而你自己的项目可以在GCC 10的环境下编译拿到C17、C20的新特性支持。很多朋友会问麒麟V10 SP3自带的GCC版本到底是多少以我实测的版本来说默认装出来一般是GCC 8.3.1或者8.5.0这个区间。这个版本编译常规的C/C代码完全没问题但你要是拿它去编译一些比较新的开源项目比如要求GCC 9的高版本MySQL、某些AI框架的预处理模块、C20特性的测试代码很容易碰到编译器不支持某些语法或者头文件缺失的情况。这时候gcc-toolset-10就是正规的解决方案。1.2 和源码编译、系统自带GCC对比优势在哪里我把三种方案放在一个表里对比过差异非常直观。方案安装耗时对系统影响卸载干净程度适用场景系统自带GCC无需安装无无法卸载编译常规老项目源码编译GCC 101-3小时容易污染系统库很难完全清理特殊定制需求gcc-toolset-10几分钟独立目录无侵入一条命令移除生产环境最推荐源码编译GCC是我一开始尝试过的路子说实话坑太多。先不说编译过程要耗掉大量CPU和内存光是各种依赖GMP、MPFR、MPC、isl就得自己挨个编译稍不注意把库装到/usr/local/lib后续其他软件编译时链接到错误版本的库那才是噩梦。gcc-toolset-10用yum装完之后所有的依赖都被dnf自动处理掉文件都装在/opt/rh和/opt/app下面跟系统的/usr完全隔离。卸载时执行yum remove gcc-toolset-10*就行了不会有残留。1.3 什么时候不适合用gcc-toolset-10也不是所有场景都推荐。如果你的内核模块、驱动开发必须精确匹配系统自带GCC的ABI版本那使用gcc-toolset-10就要慎重。因为内核编译有一套严格的工具链要求官方文档里通常明确要求使用系统默认编译器和默认参数这时候强行用GCC 10可能编译出不受支持的内核模块。另外如果你只是临时编译一个小工具系统自带GCC 8就够了完全没必要引入额外环境。我个人的判断标准是项目明确要求GCC ≥ 9或者需要C17/20新特性时才启用gcc-toolset-10。2. 动手前必须搞清楚的yum仓库底细2.1 银河麒麟V10 SP3的系统和源到底是怎么回事银河麒麟V10 SP3虽然命令风格、目录结构都和RHEL 8很像但它的yum仓库是麒麟官方自己维护的软件包的版本、依赖关系并不完全等同于CentOS 8。麒麟的源默认配置文件一般在/etc/yum.repos.d/目录下文件名带kylin字样比如kylin_x86_64.repo或kylin-aarch64.repo。操作系统安装完成后这些源就是可用的状态里面的软件包能正常安装。问题出在很多人觉得“麒麟像CentOS直接把CentOS的源替换过来就行”。这种做法十有八九会翻车。麒麟的源基于RHEL 8但不等于RHEL 8CentOS源里的很多包版本和麒麟官方源不一致依赖关系对不上。我用一个客户环境的真实经历举例子有人把CentOS 8的AppStream源替换进去后执行yum install时报了一堆Error: package xxx requires yyy后面怎么解决都解决不干净。所以在动手之前先检查系统自带的源确认这些源是否正常可用才是正路。2.2 安装前的状态检查与备份我每次在一台新的麒麟机器上操作都要先做四件事检查系统版本、确认体系架构、备份当前repo文件、测试网络连通性。这四步能在后面省掉大量排查时间。# 1. 查看系统详细版本 cat /etc/os-release # 2. 查看架构x86_64还是aarch64很重要 uname -m # 3. 备份现有yum仓库配置这是最重要的保护措施 mkdir -p /root/yum-repo-backup cp -r /etc/yum.repos.d/* /root/yum-repo-backup/ # 4. 测试默认源是否可用 yum repolist这里有个很容易被忽视的细节uname -m输出的架构直接决定了你后面该用哪个repo源、该下载哪个架构的rpm包。在ARM服务器上如果错误地使用了x86_64的源路径yum会报404或者“Cannot find a valid baseurl for repo”。我后面会专门讲这个坑。2.3 什么情况下才需要动yum仓库不是所有安装gcc-toolset-10的场景都需要改yum仓库。如果系统自带的麒麟源都正常而且源里已经有gcc-toolset-10相关的包那么安装只需要两条命令。只有在你执行了yum list available | grep gcc-toolset-10发现输出为空或者提示“没有可用软件包”时才需要认真考虑是不是要动仓库配置。绝大多数情况下默认源的包列表里是有这个软件集入口的只是需要你加重启缓存之类的操作把它刷新出来。先把默认源检查清楚再考虑改源这是我反复强调的顺序。3. 完整实操配源、装包、切换环境3.1 让yum吃到一个正确可用的仓库整体操作思路分两步先用系统默认源做验证确认默认源里有没有gcc-toolset-10如果没有再决定是启用麒麟官方配套的开发工具仓库还是走稳妥的离线rpm方案。下面是我在x86_64和aarch64两种环境下都验证过的流程。先清理缓存、重建元数据yum clean all yum makecache然后直接看一下可用的包列表里到底有没有目标软件集yum list available | grep -i gcc-toolset如果输出里能看到类似gcc-toolset-10.x86_64这样的条目那太省事了直接跳到3.2节去安装就行。如果输出为空再检查启用的repo列表yum repolist | grep -E kylin|AppStream|PowerTools麒麟V10 SP3官方源一般包含几组重要的仓库OS基础库、Updates更新库、AppStream应用流库。RHEL 8体系里gcc-toolset-10就归属于AppStream麒麟官方也是沿用了这套命名习惯。如果你发现AppStream对应的repo被禁用或者根本不存在那就需要检查系统安装时是否选择了最小化安装。如果确认源里没有这个包我的建议是优先启用麒麟源里自带的PowerTools或CRB仓库CRB在RHEL 9以后叫法麒麟V10 SP3可能叫PowerTools。RHEL 8体系中gcc-toolset-10在AppStream里但一些额外的依赖可能放在PowerTools里。执行# 先看有哪些repo处于禁用状态 yum repolist all | grep -iE PowerTools|CRB # 如果存在直接启用 yum config-manager --set-enabled PowerTools yum makecache这里要提醒一句yum config-manager来自yum-utils包如果你没有这个命令先执行yum install -y yum-utils。3.2 正式安装gcc-toolset-10仓库准备就绪后安装本身并不复杂。我习惯用明确的包名安装不依赖yum install gcc-toolset-10这种隐式依赖方式因为一个名字可能对应多个子包。yum install -y gcc-toolset-10 gcc-toolset-10-gcc gcc-toolset-10-gcc-c gcc-toolset-10-binutils gcc-toolset-10-gdb这几个包分别提供什么我解释一下gcc-toolset-10软件集的元包通常会把默认的核心组件带进来gcc-toolset-10-gccC语言编译器本体gcc-toolset-10-gcc-cC编译器本体gcc-toolset-10-binutils汇编器、链接器等二进制工具gcc-toolset-10-gdbGDB调试器如果你用不到调试器gdb那项可以去掉。安装过程中yum会把这个软件集的所有依赖自动装好一般包括头文件、运行时库等等。整个安装过程在几百MB到1GB之间取决于你装了哪些子包。如果你执行到这里发现yum提示需要处理依赖关系或者需要额外安装一堆包也别慌。只要来源还是麒麟官方源依赖关系就是被测试过的直接确认安装即可。真正要警惕的是提示里出现其他第三方源的包名这种情况我会停下来检查。3.3 验证GCC 10环境生效安装完成后系统默认的gcc命令仍然是老版本。要验证gcc-toolset-10是否真的可用需要手动激活环境。激活方式两种我分别试过都可以用# 方式一临时切换当前shell有效 scl enable gcc-toolset-10 bash # 方式二直接导入环境变量脚本同样只对当前shell有效 source /opt/rh/gcc-toolset-10/enable激活后输入以下命令验证gcc --version which gcc正常情况下输出里的版本应该是gcc (GCC) 10.x.x并且which gcc指向的路径是/opt/rh/gcc-toolset-10/root/usr/bin/gcc而不是/usr/bin/gcc。看到这个路径就说明你成功启用了GCC 10环境而且没有影响系统的默认编译器。如果你的shell脚本不是bash比如用zsh或shscl enable也能正常工作它本质上就是执行一段环境变量加载脚本。3.4 开机自动生效与脚本化使用临时的激活方式显然不适合长期使用。如果你希望登录系统后就自动进入GCC 10环境可以在/etc/profile.d/下新建一个脚本把环境引入放进去cat /etc/profile.d/gcc-toolset-10.sh EOF #!/bin/bash source /opt/rh/gcc-toolset-10/enable EOF chmod x /etc/profile.d/gcc-toolset-10.sh但对于生产环境我不建议把全局环境变量改成GCC 10的路径。因为系统其他服务、监控代理、运维脚本很可能依赖系统默认的编译器路径全局生效容易引发未知问题。更好的方式是单独写一个编译脚本在脚本开头显式source环境文件#!/bin/bash source /opt/rh/gcc-toolset-10/enable cd /home/project make clean make这样既能让项目使用GCC 10又不污染全局环境。如果你是给systemd服务写编译命令也可以在service文件的ExecStart里加上/bin/bash -c source /opt/rh/gcc-toolset-10/enable 你的命令。4. 避坑指南yum仓库安装中最容易翻车的5类问题4.1 直接拿CentOS源替换麒麟源结果一片404这个坑我见得太多了。现象是执行yum makecache时出现大量404错误或者提示“Error: Failed to download metadata for repo appstream”。原因很简单CentOS 8的生命周期已经结束了官方源迁移到了archive路径而CentOS Stream的源目录结构和麒麟V10 SP3根本不匹配。这里的关键认知是麒麟官方源基于RHEL 8生态但不是CentOS源。两个体系对同一个软件包可能有不同的小版本、不同的依赖补丁。简单粗暴地替换轻则某些包找不到重则整个依赖树崩溃。我的建议是如果默认源的版本你实在不想要那么优先去麒麟官方找对应SP3版本的更新源或者PowerTools源不要碰CentOS的源。4.2 仓库里明明有包却提示Nothing provides有时候你执行yum list available | grep gcc-toolset-10明明看到这个包但执行yum install gcc-toolset-10-gcc却报错“没有任何匹配”或者“Nothing provides xxx needed by yyy”。这种情况常见的原因是两个一是模块化流Module Stream冲突。RHEL 8体系里很多开发工具包被纳入了模块流同一包名在不同模块流下有不同的版本组合。gcc-toolset-10虽然不属于典型的module包但它的某些依赖可能被子模块控制。如果系统里已经启用了某个冲突的module stream就可能出现包名可见但装上不的情况。二是repo优先级问题。多个repo同时启用时如果都提供了某个依赖但版本不同yum会按照repo的优先级和module_hotfixes等配置来决定。解决办法是先查看模块状态yum module list | grep gcc yum module list --enabled | grep gcc如果显示有gcc-toolset相关的module处于enabled状态可以尝试重置yum module reset gcc-toolset-10 -y yum install gcc-toolset-10 -y4.3 GPG签名校验失败和公钥导入麒麟官方源默认是开启GPG校验的这个安全机制非常关键。很多初学者为了省事直接去改配置文件把gpgcheck0这等于把服务器暴露在软件包被篡改的风险之下生产环境绝对不要这么干。正常的做法是在第一次使用某个仓库时导入对应的GPG公钥。如果yum提示类似“Public key for xxx.rpm is not installed”说明你的系统里没有该repo的公钥。这时可以通过rpm命令导入# 以麒麟官方源的公钥为例实际路径以repo配置里的gpgkey值为准 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-kylin-SECURE rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-kylin导入完再次执行yum install就不会再报签名问题了。如果你不确定公钥文件具体叫什么可以先在/etc/pki/rpm-gpg/目录下列一下找到带kylin关键字的文件导入即可。4.4 依赖冲突、libstdc版本打架这类问题最典型的场景是系统里有些软件是用老GCC编译的安装gcc-toolset-10后某些动态库搜到了新库目录导致启动时提示versionGLIBCXX_3.4.XX not found。说实话真正的gcc-toolset-10安装不会自动修改/usr/lib64下的任何库因为它的库文件全部集中在/opt/rh/gcc-toolset-10/root/usr/lib/gcc等独立路径下。如果出现libstdc找不到、版本冲突这类问题原因大概率是你之前手动往/usr/lib64里拷过其他版本的libstdc.so或者用源码编译方式装过GCC并污染了系统库目录。这种情况下我的建议是检查/usr/lib64/libstdc.so.6到底指向哪个文件版本strings /usr/lib64/libstdc.so.6 | grep GLIBCXX | tail -20如果发现有多个可疑的libstdc.so.6副本先找出是哪个软件包提供的rpm -qf /usr/lib64/libstdc.so.6把非rpm包管理的文件清理掉让系统回到只有rpm包统一管理的状态。gcc-toolset-10本身并不会要求你替换系统libstdc。4.5 ARM架构(aarch64)下源路径的坑这个问题放到最后写因为在实际使用中它最隐蔽。麒麟V10 SP3的ARM版本aarch64在服务器市场占有率很高。很多在x86_64上正常的repo配置到了aarch64机器上就是不好使。核心区别就在baseurl里的架构标识。看一个repo文件时一定要确认baseurl中包含aarch64而不是写死的x86_64。麒麟官方源的路径一般通过$basearch变量动态获取架构比如baseurlhttp://archive.kylinos.cn/kylin/Yum/V10/SP3/os/$basearch/这个写法会在x86_64机器上自动指向x86_64目录在aarch64机器上自动指向aarch64目录。但如果某个源被人为写死了x86_64那么在ARM机器上必然报404。排查方法很简单执行yum repolist -v | grep BaseURL实际显示的URL路径就能看出架构是不是正确。如果指向了x86_64但你的机器是aarch64修改repo文件里的$basearch或者强制指定baseurl为aarch64路径即可。另外我遇到过ARM架构下特定工具链版本比x86_64缺几个子包的情况。比如某个调试工具在x86_64源里有但在aarch64源里没有。这不是配置问题而是官方源的同步问题。遇到这种情况我的建议是换个时间再试或者先跳过缺失的子包等待源更新后再补装。5. 装好之后这几点使用经验很关键5.1 三种常见切换方式的使用场景gcc-toolset-10装好之后怎么切换环境我列一下实际使用中最常碰到的三种场景和对应做法。第一种交互式编译。你在终端里临时编译一个小程序适合用scl enable gcc-toolset-10 bash或者source /opt/rh/gcc-toolset-10/enable当前终端立即生效退出终端就恢复默认。第二种自动化构建脚本。比如Jenkins的Pipeline脚本或者Crontab定时任务里面要编译项目就应该在脚本里显式source环境文件。因为这些自动化任务启动的shell环境很干净不会加载/etc/profile.d/里你自己加进去的环境变量。正确做法是每个脚本第一行就处理好环境#!/bin/bash source /opt/rh/gcc-toolset-10/enable make release第三种让某个服务或者守护进程长期使用GCC 10的环境。我一般会在对应的systemd service文件里加上一行环境导入[Service] EnvironmentFile/opt/rh/gcc-toolset-10/enable或者在service启动命令里包一层bash -c。这里更推荐EnvironmentFile方式干净、直观。5.2 用新的GCC 10编译C17代码验证我习惯装好工具链后马上写一个C17的测试程序验证防止后面才发现环境有问题。给你一个简单例子包含C17的结构化绑定和if constexpr特性#include iostream #include tuple #include string int main() { auto person std::make_tuple(Alice, 30); auto [name, age] person; std::cout Name: name , Age: age std::endl; constexpr int value 42; if constexpr (value 40) { std::cout C17 if constexpr works. std::endl; } return 0; }保存为test.cpp然后source /opt/rh/gcc-toolset-10/enable g -stdc17 -o test test.cpp ./test如果输出正常说明环境完全可用。这个测试方法我每次写完都跑一遍因为在它上面浪费的一分钟能在后面省下好几个小时的问题排查时间。5.3 如果官方源始终没有这个包怎么办总有那么几个环境网络受限、官方源里也没收录gcc-toolset-10。这时候我不建议你去网上随意下载rpm包来装风险太大。更稳妥的思路是找一台相同架构、相同SP3版本且已经成功安装gcc-toolset-10的机器把rpm包导出出来拷贝到目标机器离线安装# 在已经装好gcc-toolset-10的机器上导出所有相关rpm包 mkdir -p /tmp/gcc-toolset-10-rpms yumdownloader --resolve gcc-toolset-10 \ gcc-toolset-10-gcc \ gcc-toolset-10-gcc-c \ gcc-toolset-10-binutils \ gcc-toolset-10-gdb \ --destdir/tmp/gcc-toolset-10-rpms然后把整个目录拷到目标机器上执行yum localinstall /tmp/gcc-toolset-10-rpms/*.rpm -y用yum localinstall而不是rpm -ivh是为了让yum帮你解析和校验依赖关系。离线安装时最容易踩的坑是漏了某个依赖包所以导出rpm时务必加上--resolve参数。我自己还在生产环境里遇到过一种情况机器在隔离网段完全无法访问外网只能靠内网搭建的镜像源分发软件包。这种环境的核心思路其实是先确保镜像源里同步了麒麟V10 SP3的AppStream和PowerTools仓库内容只要这两个仓库同步全了gcc-toolset-10的依赖都能在本地镜像里找到。聊到这儿整条安装链路应该已经很清楚了。我个人在实际操作中的感受是很多人把“装个gcc工具集”想得太简单又太多人把“改yum源”想得太复杂。其实只要抓住几个关键点不动系统自带编译器、不随意替换官方源、不关闭GPG校验、架构和路径严格对应、临时切换优先于全局替换大部分问题根本不会出现。如果你在某个Linux发行版上装gcc-toolset系列已经轻车熟路了那么这套思路放到其他RHEL生态的国产系统上同样能少走弯路。