首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CentOS 7码头安装gcc/g++ 9 (centos:7)

如何在CentOS 7码头安装gcc/g++ 9 (centos:7)
EN

Stack Overflow用户
提问于 2021-04-14 11:05:24
回答 2查看 12.6K关注 0票数 7

为了使用C++17包括<filesystem>,我需要gcc-9包在我的中心7码头.

默认情况下,centos:7将从常规发行版回购中安装gcc 4.8.5。

代码语言:javascript
复制
docker run --rm -it centos:7
# yum install -y gcc
# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

有没有任何方法可以方便地安装gcc-9 (或更高版本)软件包(即不从源代码构建它)

谢谢!

注:需要gcc-9具备良好的C++17 <filesystem>支持.

GCC 9号新闻稿:

现在,使用<filesystem>中的类型和函数不需要与-lstdc++fs链接。

src:https://gcc.gnu.org/gcc-9/changes.html

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-22 12:06:15

到目前为止我所拥有的是:

cat Dockerfile

代码语言:javascript
复制
FROM centos:7 AS env

RUN yum update -y
RUN yum install -y centos-release-scl
RUN yum install -y devtoolset-9

RUN echo "source /opt/rh/devtoolset-9/enable" >> /etc/bashrc
SHELL ["/bin/bash", "--login", "-c"]
RUN gcc --version

所以你必须:

  1. 将源内容添加到bashrc中 注意:在Centos上是/etc/bashrc,而在ubuntu上是/etc/bash.bashrc
  2. 将码头默认外壳更新为bash,并使用--login“加载”bashrc

输出

代码语言:javascript
复制
docker build .
Sending build context to Docker daemon  4.096kB
Step 1/32 : FROM centos:7 AS env
 ---> 8652b9f0cb4c
Step 2/32 : RUN yum update -y
 ---> Using cache
 ---> a2bb269cd8dc
Step 3/32 : RUN yum install -y centos-release-scl
 ---> Using cache
 ---> 1184e26c71cf
Step 4/32 : RUN yum install -y devtoolset-9
 ---> Using cache
 ---> e678665d2a4e
Step 5/32 : RUN echo "source /opt/rh/devtoolset-9/enable" >> /etc/bashrc
 ---> Using cache
 ---> fe1745d4ca87
Step 6/32 : SHELL ["/bin/bash", "--login", "-c"]
 ---> Running in 2dd7955f4487
Removing intermediate container 2dd7955f4487
 ---> 3cf4835bf680
Step 7/32 : RUN gcc --version
 ---> Running in b5de3266d607
gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 ...

什么不起作用

测试1

代码语言:javascript
复制
RUN scl enable devtoolset-9 bash
RUN gcc --version | head -1

每个RUN都是一个新的shell,因此子bash在第二行丢失。

测试2

代码语言:javascript
复制
RUN source /opt/rh/devtoolset-9/enable && gcc --version | head -1
RUN gcc --version | head -1

在这里,源仅用于第一个运行shell命令,但将丢失.

测试3

这可能会奏效,但可能会有意想不到的行为。

代码语言:javascript
复制
ENV PATH=/opt/rh/devtoolset-9/root/bin:$PATH
RUN gcc --version | head -1

在这里,我们只“修复”PATH变量,但是如果您查看/opt/rh/devtoolset-9/enable脚本,那么要做的不仅仅是更新PATH.

票数 18
EN

Stack Overflow用户

发布于 2022-04-07 14:42:25

另一种解决方案是将程序作为命令行上的字符串传递:

代码语言:javascript
复制
RUN scl enable devtoolset-9 'gcc --version'

关于GitLab的CI,也请参见回答的相应问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67090507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档