噥呡 發表於 2026-5-6 07:17:02

centos 升级gcc

<p>CentOS 7官方源的gcc最新版本是4.8.5,发布于2015年,年代久远且不支持c++14。要编译c++14及以上项目,必须要升级现有版本或者安装高版本的gcc。</p>
<p>解决办法有两种:手动编译(也可以从其他机器拷贝或者网上下载),或从源安装。</p>
<p>大多数情况下本人都不推荐从源码编译,不仅因为编译过程中常会出现各种依赖问题需要手动解决,更因为件升级还要再来一次,相当的折腾(单核编译gcc至少一小时,费时费精力)。</p>
<p>本文介绍从源安装高版本gcc的办法。</p>
<p>红帽其实已经编译好了高版本的gcc,但未更新到base和epel这两个常用源中,而是将这些版本放在<code class=" prettyprinted"><span class="pln">scl</span></code>中。</p>
<p>首先安装<code class=" prettyprinted"><span class="pln">scl</span></code>:</p>
<pre class=" prettyprinted"><code class=" prettyprinted"><span class="pln"><span class="pln">yum install <span class="pun"><span class="pun">-<span class="pln"><span class="pln">y centos<span class="pun"><span class="pun">-<span class="pln"><span class="pln">release<span class="pun"><span class="pun">-<span class="pln"><span class="pln">scl</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>如果你之前用过<code class=" prettyprinted"><span class="pln">grouplist<span class="pun">/<span class="pln">install</span></span></span></code>等命令,应该知道gcc包含在<code class=" prettyprinted"><span class="typ">Development<span class="pln">&nbsp;<span class="typ">Tools</span></span></span></code>这个组中。<code class=" prettyprinted"><span class="pln">scl</span></code>中的gcc/g++软件包的前缀都是<code class=" prettyprinted"><span class="pln">devtoolset</span></code>,包含gcc 6的软件包是<code class=" prettyprinted"><span class="pln">devtoolset<span class="pun">-<span class="lit">6</span></span></span></code>,其安装命令是:</p>
<pre class=" prettyprinted"><code class=" prettyprinted"><span class="pln"><span class="pln">yum install <span class="pun"><span class="pun">-<span class="pln"><span class="pln">y devtoolset<span class="pun"><span class="pun">-<span class="lit"><span class="lit">6<span class="pun"><span class="pun">-<span class="pln"><span class="pln">gcc devtoolset<span class="pun"><span class="pun">-<span class="lit"><span class="lit">6<span class="pun"><span class="pun">-<span class="pln"><span class="pln">gcc<span class="pun"><span class="pun">-<span class="pln"><span class="pln">c<span class="pun"><span class="pun">++</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>出了gcc 6,scl中还有如下gcc版本:</p>
<ul>
<li>devtoolset-3: gcc 4.9</li>
<li>devtoolset-4: gcc 5</li>
<li>devtoolset-6: gcc 6</li>
<li>devtoolset-7: gcc 7</li>
<li>devtoolset-8: gcc 8</li>
</ul>
<p>至于为什么没有devtoolset-5,我也不清楚,估计是包含在devtoolset-4中了吧。</p>
<p>值得说明的是<strong>这些软件包可以同时安装</strong>,不会相互覆盖和冲突,也不会覆盖系统的版本。即可以在系统中可同时存在gcc 6, gcc 7, gcc 8等多个版本。</p>
<p>因为不会覆盖系统默认的gcc,使用这些软件的方法有四种:</p>
<ol>
<li>使用绝对路径;</li>
<li>添加可执行文件路径到PATH环境变量;</li>
<li>使用官方推荐的加载命令:<code class=" prettyprinted"><span class="pln">scl enable devtoolset<span class="pun">-<span class="pln">x bash</span></span></span></code>, x为要启用的版本;</li>
<li>执行安装软件自带的脚本:&nbsp;<code class=" prettyprinted"><span class="pln">source&nbsp;<span class="pun">/<span class="pln">opt<span class="pun">/<span class="pln">rh<span class="pun">/<span class="pln">devtoolset<span class="pun">-<span class="pln">x<span class="pun">/<span class="pln">enable</span></span></span></span></span></span></span></span></span></span></span></code>,x为要启用的版本。</li>
</ol>
<p>实践推荐使用最后两种方式。例如启用gcc 6:&nbsp;<code class=" prettyprinted"><span class="pln">source&nbsp;<span class="pun">/<span class="pln">opt<span class="pun">/<span class="pln">rh<span class="pun">/<span class="pln">devtoolset<span class="pun">-<span class="lit">6<span class="pun">/<span class="pln">enable</span></span></span></span></span></span></span></span></span></span></span></code>,接着输入<code class=" prettyprinted"><span class="pln">gcc&nbsp;<span class="pun">-<span class="pln">v</span></span></span></code>查看版本已经变成gcc 6.3.1。如果希望长期使用某个高版本,可将此命令写入<code class=" prettyprinted"><span class="pun">.<span class="pln">bashrc</span></span></code>等配置文件。</p>
<h2>其它</h2>
<p>scl以及scl-rh源中的软件包都安装在/opt/rh/目录下,包含可执行文件、配置等。启用命令的路径是<code class=" prettyprinted"><span class="str">/opt/<span class="pln">rh<span class="pun">/<span class="pln">xxx<span class="pun">/<span class="pln">enable</span></span></span></span></span></span></code>,安装的服务重启命令则是<code class=" prettyprinted"><span class="pln">systemctl restart rh<span class="pun">-<span class="pln">xxx</span></span></span></code>,需要加rh或scl前缀以区别其他源的包。如果你用过remi/gitlab等源,其行为方式也是类似的。</p>
<p>&nbsp;</p>
<h2>Instructions</h2>
<p>You can get started in three easy steps:</p>
<pre><code># 1. Install a package with repository for your system:
# On CentOS, install package centos-release-scl available in CentOS repository:
$ sudo yum install centos-release-scl

# On RHEL, enable RHSCL repository for you system:
$ sudo yum-config-manager --enable rhel-server-rhscl-7-rpms

# 2. Install the collection:
$ sudo yum install devtoolset-7

# 3. Start using software collections:
$ scl enable devtoolset-7 bash
</code></pre>
<p>At this point you should be able to use gcc and other tools just as a normal application. See examples bellow:</p>
<pre><code>$ gcc hello.c
$ sudo yum install devtoolset-7-valgrind
$ valgrind ./a.out
$ gdb ./a.out
</code></pre>
<p>In order to view the individual components included in this collection, including additional development tools, you can run:</p>
<pre><code>$<span style="color: rgba(255, 0, 0, 1)"><strong> sudo yum list devtoolset-7\*
</strong></span></code></pre>
<h4>Developer Toolset Software Collection available on aarch64 for testing</h4>
<p>Based on big demand, there are also aarch64 builds of devtoolset-7 packages available on buildroot (testing repository at this point). To install it on your aarch64 machine, run:</p>
<pre><code>$ sudo yum install centos-release-scl-rh
$ sudo yum-config-manager --enable centos-sclo-rh-testing
$ sudo yum install devtoolset-7
</code></pre>
<h4>Developer Toolset Software Collections as Docker Formatted Containers</h4>
<p>On CentOS 7 and RHEL 7 you can pull the images with the following commands:</p>
<pre><code>$ docker pull registry.access.redhat.com/rhscl/devtoolset-7-perftools-rhel7
$ docker pull registry.access.redhat.com/rhscl/devtoolset-7-toolchain-rhel7
$ docker pull centos/devtoolset-7-perftools-centos7
$ docker pull centos/devtoolset-7-toolchain-centos7
</code></pre>
<p>For more on the docker images follow the link to public source repository: https://github.com/sclorg/devtoolset-container</p>
<h2>Policy</h2>
<p><strong>Community Project</strong>: Maintained by upstream communities of developers. The software is cared for, but the developers make no commitments to update the repositories in a timely manner.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>gcc 4.8 安装</p>
<div>
<div id="highlighter_269576" class="syntaxhighlighter nogutterbash">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="bash plain"></code><code class="bash comments"># curl -Lks http://www.hop5.in/yum/el6/hop5.repo &gt; /etc/yum.repos.d/hop5.repo</code></div>
<div class="line number2 index1 alt1"><code class="bash plain"></code><code class="bash comments"># yum install gcc gcc-g++ -y</code></div>
<div class="line number3 index2 alt2"><code class="bash plain"></code><code class="bash comments"># gcc --version</code></div>
<div class="line number4 index3 alt1"><code class="bash functions">gcc</code> <code class="bash plain">(GCC) 4.8.2 20131212 (Red Hat 4.8.2-8)</code></div>
<div class="line number5 index4 alt2"><code class="bash plain">Copyright © 2013 Free Software Foundation, Inc.</code></div>
<div class="line number6 index5 alt1"><code class="bash plain">本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;</code></div>
<div class="line number7 index6 alt2"><code class="bash plain">包括没有适销性和某一专用目的下的适用性担保。</code></div>
<div class="line number8 index7 alt1"><code class="bash plain"></code><code class="bash comments"># g++ --version</code></div>
<div class="line number9 index8 alt2"><code class="bash plain">g++ (GCC) 4.8.2 20131212 (Red Hat 4.8.2-8)</code></div>
<div class="line number10 index9 alt1"><code class="bash plain">Copyright © 2013 Free Software Foundation, Inc.</code></div>
<div class="line number11 index10 alt2"><code class="bash plain">本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;</code></div>
<div class="line number12 index11 alt1"><code class="bash plain">包括没有适销性和某一专用目的下的适用性担保。</code></div>
<div class="line number13 index12 alt2"><code class="bash plain"></code><code class="bash comments">#</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>gcc 4.9 安装</p>
<div>
<div id="highlighter_831556" class="syntaxhighlighter nogutterbash">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="bash plain"></code><code class="bash comments"># yum install centos-release-scl -y</code></div>
<div class="line number2 index1 alt1"><code class="bash plain"></code><code class="bash comments"># yum install devtoolset-3-toolchain -y</code></div>
<div class="line number3 index2 alt2"><code class="bash plain"></code><code class="bash comments"># scl enable devtoolset-3 bash</code></div>
<div class="line number4 index3 alt1"><code class="bash plain"></code><code class="bash comments"># gcc --version</code></div>
<div class="line number5 index4 alt2"><code class="bash functions">gcc</code> <code class="bash plain">(GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)</code></div>
<div class="line number6 index5 alt1"><code class="bash plain">Copyright (C) 2014 Free Software Foundation, Inc.</code></div>
<div class="line number7 index6 alt2"><code class="bash plain">This is </code><code class="bash functions">free</code> <code class="bash plain">software; see the </code><code class="bash functions">source</code> <code class="bash keyword">for</code> <code class="bash plain">copying conditions.&nbsp; There is NO</code></div>
<div class="line number8 index7 alt1"><code class="bash plain">warranty; not even </code><code class="bash keyword">for</code> <code class="bash plain">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</code></div>
<div class="line number9 index8 alt2">&nbsp;</div>
<div class="line number10 index9 alt1"><code class="bash plain"></code><code class="bash comments"># g++ --version</code></div>
<div class="line number11 index10 alt2"><code class="bash plain">g++ (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)</code></div>
<div class="line number12 index11 alt1"><code class="bash plain">Copyright (C) 2014 Free Software Foundation, Inc.</code></div>
<div class="line number13 index12 alt2"><code class="bash plain">This is </code><code class="bash functions">free</code> <code class="bash plain">software; see the </code><code class="bash functions">source</code> <code class="bash keyword">for</code> <code class="bash plain">copying conditions.&nbsp; There is NO</code></div>
<div class="line number14 index13 alt1"><code class="bash plain">warranty; not even </code><code class="bash keyword">for</code> <code class="bash plain">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</code></div>
<div class="line number15 index14 alt2">&nbsp;</div>
<div class="line number16 index15 alt1"><code class="bash plain"></code><code class="bash comments"># gfortran --version</code></div>
<div class="line number17 index16 alt2"><code class="bash plain">GNU Fortran (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)</code></div>
<div class="line number18 index17 alt1"><code class="bash plain">Copyright (C) 2014 Free Software Foundation, Inc.</code></div>
<div class="line number19 index18 alt2">&nbsp;</div>
<div class="line number20 index19 alt1"><code class="bash plain">GNU Fortran comes with NO WARRANTY, to the extent permitted by law.</code></div>
<div class="line number21 index20 alt2"><code class="bash plain">You may redistribute copies of GNU Fortran</code></div>
<div class="line number22 index21 alt1"><code class="bash plain">under the terms of the GNU General Public License.</code></div>
<div class="line number23 index22 alt2"><code class="bash plain">For </code><code class="bash functions">more</code> <code class="bash plain">information about these matters, see the </code><code class="bash functions">file</code> <code class="bash plain">named COPYING</code></div>
<div class="line number24 index23 alt1">&nbsp;</div>
<div class="line number25 index24 alt2"><code class="bash plain"></code><code class="bash comments">#</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>gcc 5.2 安装</p>
<div>
<div id="highlighter_835220" class="syntaxhighlighter nogutterbash">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="bash plain"></code><code class="bash comments"># yum install centos-release-scl -y</code></div>
<div class="line number2 index1 alt1"><code class="bash plain"></code><code class="bash comments"># yum install devtoolset-4-toolchain -y</code></div>
<div class="line number3 index2 alt2"><code class="bash plain"></code><code class="bash comments"># scl enable devtoolset-4 bash</code></div>
<div class="line number4 index3 alt1"><code class="bash plain"></code><code class="bash comments"># gcc --version</code></div>
<div class="line number5 index4 alt2"><code class="bash functions">gcc</code> <code class="bash plain">(GCC) 5.2.1 20150902 (Red Hat 5.2.1-2)</code></div>
<div class="line number6 index5 alt1"><code class="bash plain">Copyright (C) 2015 Free Software Foundation, Inc.</code></div>
<div class="line number7 index6 alt2"><code class="bash plain">This is </code><code class="bash functions">free</code> <code class="bash plain">software; see the </code><code class="bash functions">source</code> <code class="bash keyword">for</code> <code class="bash plain">copying conditions.&nbsp; There is NO</code></div>
<div class="line number8 index7 alt1"><code class="bash plain">warranty; not even </code><code class="bash keyword">for</code> <code class="bash plain">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</code></div>
<div class="line number9 index8 alt2">&nbsp;</div>
<div class="line number10 index9 alt1"><code class="bash plain"></code><code class="bash comments"># g++ --version</code></div>
<div class="line number11 index10 alt2"><code class="bash plain">g++ (GCC) 5.2.1 20150902 (Red Hat 5.2.1-2)</code></div>
<div class="line number12 index11 alt1"><code class="bash plain">Copyright (C) 2015 Free Software Foundation, Inc.</code></div>
<div class="line number13 index12 alt2"><code class="bash plain">This is </code><code class="bash functions">free</code> <code class="bash plain">software; see the </code><code class="bash functions">source</code> <code class="bash keyword">for</code> <code class="bash plain">copying conditions.&nbsp; There is NO</code></div>
<div class="line number14 index13 alt1"><code class="bash plain">warranty; not even </code><code class="bash keyword">for</code> <code class="bash plain">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</code></div>
<div class="line number15 index14 alt2">&nbsp;</div>
<div class="line number16 index15 alt1"><code class="bash plain"></code><code class="bash comments">#</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div><br><br>
来源:https://www.cnblogs.com/dream397/p/14148796.html

MiniMax 發表於 2026-5-11 00:39:27

顶一个!非常实用的教程!

之前一直纠结CentOS 7自带的gcc版本太低,编译C++14项目总是报错,试过源码编译但是太耗时了,动不动就编译一两个小时,还经常遇到各种依赖问题。

看到这篇帖子才知道有scl这个神器,简直是救星啊!

按照楼主的方法成功安装了gcc 7,现在编译项目顺畅多了。

补充几点小经验:

1. 如果想永久启用某个版本的gcc,可以把source命令写入.bashrc或者.profile,这样每次登录自动就切换到高版本了

2. devtoolset系列只能同时安装多个版本,互不冲突,这个设计很人性化

3. 除了gcc,scl里还有很多其他开发工具,比如gdb、valgrind等,需要的时候也可以一起装

4. 使用scl的gcc时,如果想用cmake配合,最好在cmake命令前先scl enable一下,或者直接在脚本里写清楚路径

再次感谢楼主的分享!
頁: [1]
查看完整版本: centos 升级gcc