更改不支持使用 compilers.yaml 文件编译 C++ 程序的 gcc 版本

Posted

技术标签:

【中文标题】更改不支持使用 compilers.yaml 文件编译 C++ 程序的 gcc 版本【英文标题】:Change version of gcc which does not support compiling C++ programs using the compilers.yaml file 【发布时间】:2021-08-26 05:02:38 【问题描述】:

我正在尝试使用spack 安装hpctoolkit。为了做到这一点,我执行了:

git clone https://github.com/spack/spack.git
cd spack/share/spack
source setup-env.sh 
spack fetch -D hpctoolkit
spack install hpctoolkit 

我无法执行最后一个命令,因为我收到以下错误:

Error: ProcessError: Command exited with status 1:
    './bootstrap.sh' '--prefix=/home/hakim/spack/opt/spack/linux-ubuntu20.04-haswell/gcc-10.2.0/boost-1.76.0-oc2u6jxritfsbci4xkhr5lov3i4o4riq' '--with-toolset=gcc' '--with-libraries=serialization,atomic,log,exception,regex,math,random,program_options,wave,iostreams,chrono,system,test,graph,locale,timer,filesystem,date_time,thread' '--without-icu'

它建议我通过显示以下消息来查看构建日志:

See build log for details:
  /tmp/hakim/spack-stage/spack-stage-boost-1.76.0-oc2u6jxritfsbci4xkhr5lov3i4o4riq/spack-build-out.txt

之前的文件包含:

A C++11 capable compiler is required for building the B2 engine.
Toolset 'gcc' does not appear to support C++11.

> g++ -x c++ -std=c++11  check_cxx11.cpp
ERROR: Compiler 'gcc@10.2.0' does not support compiling C++ programs.

在阅读一点 Spack 表示法时,我了解到 '@' 指定了包版本,所以我猜我使用的 gcc 版本不支持编译 C++ 程序。

我应该怎么做才能让它支持编译C++程序? 有什么帮助吗?

【问题讨论】:

GCC 自第 4 版系列以来(至少部分)支持 C++11 标准。版本 10 完全支持 C++11 和更新的标准。如果使用了正确的 GCC,那么它应该可以工作。您的系统中是否安装了多个 GCC 实例?也许路径中的第一个是较旧的安装? 你安装g++了吗?如果您使用的是基于 ubuntu,请安装 build-essential 正如我所说,GCC 早在第 9 版之前就已经支持 C++11,因此您的两个安装都应该工作。问题是别的。 我不是问你(认为你)安装了什么版本,我想知道g++ --version 的输出到底是什么。 不客气。请花一些时间用确切的程序写下答案。此外,请考虑更新标题以更好地反映问题。 【参考方案1】:

正如您在错误中看到的,编译器“gcc@10.2.0”不支持编译 C++ 程序。

为了显示编译器,使用命令:

spack compiler list 

在淘汰误导性版本之前,我对上一个命令有以下结果:

-- clang ubuntu20.04-x86_64 -------------------------------------
clang@10.0.0  clang@7.0.1

-- gcc ubuntu20.04-x86_64 ---------------------------------------
gcc@9.3.0    gcc@10.2.0

为了摆脱“gcc@10.2.0”版本,我修改了compilers.yaml,这是一个单独的文件,用于存储有关可用编译器的信息。该文件通常位于您的主目录~/.spack/platform 中,其中‘platform’ 通常为‘linux’(或者‘cray’‘bgq’)。

就我而言,我做到了:

cd ~/.spack/linux
emacs compilers.yaml & 

并找到(我只显示与 gcc 编译器相关的部分):

    compilers:
    - compiler:
            spec: gcc@10.2.0
            paths:
              cc: /usr/bin/gcc-10
              cxx: null
              f77: /usr/bin/gfortran-10
              fc: /usr/bin/gfortran-10
            flags: 
            operating_system: ubuntu20.04
            target: x86_64
            modules: []
            environment: 
            extra_rpaths: []

    - compiler:
        spec: gcc@9.3.0
        paths:
          cc: /usr/bin/gcc-9
          cxx: null
          f77: /usr/bin/gfortran-9
          fc: /usr/bin/gfortran-9
        flags: 
        operating_system: ubuntu20.04
        target: x86_64
        modules: []
        environment: 
        extra_rpaths: []

为了摆脱gcc@10.2.0,只需删除它的一部分。 现在验证编译器列表,您应该会发现:

-- clang ubuntu20.04-x86_64 -------------------------------------
clang@10.0.0  clang@7.0.1

-- gcc ubuntu20.04-x86_64 ---------------------------------------
gcc@9.3.0

最后一步:

spack install hpctoolkit 

现在,一切正常。

【讨论】:

以上是关于更改不支持使用 compilers.yaml 文件编译 C++ 程序的 gcc 版本的主要内容,如果未能解决你的问题,请参考以下文章

使用Python操纵具有链接和跟踪更改的Microsoft Word DOCX文件

如何更换 OpenStack 默认的 Hypervisor

ansible的安装及配置文件更改

如何更换 OpenStack 默认的 Hypervisor

如何更改delphi7中窗体(form)左上角的图标?都支持那些类型的图标,如,ico,jpe?为何更改图标后显示出错呢?不

使用VMWare虚拟机打开MFC报错:不支持16位系统