为啥我缺少 C++20 标头?我该如何解决这个问题?

Posted

技术标签:

【中文标题】为啥我缺少 C++20 标头?我该如何解决这个问题?【英文标题】:Why am I missing C++20 headers? And how do I fix this?为什么我缺少 C++20 标头?我该如何解决这个问题? 【发布时间】:2021-11-01 09:06:00 【问题描述】:

几个月来我一直在谷歌搜索试图解决这个问题,但我没有尝试过任何工作。

这样一个简单的程序:

#include <concepts>
#include <iostream>

int main() 
    std::cout << "Test" << std::endl;
    return 0;

编译失败,错误消息fatal error: 'concepts' file not found。 clang++ 和 g++ 编译器都会发生这种情况。 (为了完整性:clang++-11 -std=c++20 test.cppg++ -std=c++2a test.cpp。)

我的编译器版本是:

> clang++-11 --version
Ubuntu clang version 11.0.0-2~ubuntu20.04.1

> g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

如果我查找我的 C++ 头文件,我可以在 /usr/include/c++ 中找到它们:

> find /usr -name "iostream"
/usr/lib/llvm-10/include/c++/v1/iostream
/usr/include/c++/9/iostream

但是,find /usr -name "concepts" 什么也没提供。所以标题肯定丢失了。连同所有其他特定于 C++20 的头文件,以及在其他头文件中定义的特定于 C++20 的函数(例如 [std::bit_width][1] - 可以包含头文件但未定义函数)。

顺便说一句,我可以使用所有 C++20 功能。例如,我可以定义自己的概念,虽然我不能使用概念头。

奇怪的是,我在谷歌上搜索这类问题的地方无处不在,我能找到的唯一问题是使用不支持 C++20 的旧编译器的人,或者缺少所有 C++ 头文件(或者编译器可以找不到他们)。但是我不确定我应该做什么,因为我的编译器显然支持 C++20,但我缺少 C++20 头文件。

我确实尝试查看libstdc++ 是否需要更新,但无济于事:

> sudo apt install libc++-dev
[...]
libc++-dev is already the newest version (1:10.0-50~exp1).

【问题讨论】:

有一个很好的 feature test 程序(在示例区域中),您可以使用 C++20 编译和运行它,生成的程序会告诉您哪些 C++20 功能可用于您的特定编译器。 (许多编译器的 C++20 实现还没有 100% 完成。) gcc 从版本 10 开始支持概念。 【参考方案1】:

所以我需要安装 g++ 版本 10 来获取所需的标头。我以为我拥有所有东西的最新版本,但我想我可能更新了gcc 而不是g++。对于遇到此问题的任何人,请务必仔细检查您的 g++ --version,而不是 gcc --version,以防它们不同。

无论如何,以下解决了这个问题:

sudo apt install g++-10

【讨论】:

以上是关于为啥我缺少 C++20 标头?我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

Makefile:2: *** 缺少分隔符。停止。我该如何解决这个问题我是 Raylib for C++ 的新手

ERR_HTTP_HEADERS_SENT - Express:标头在发送到客户端后无法设置,我该如何解决这个错误?

为啥颤振向我显示此错误,我该如何解决?

为啥我的工具输出会覆盖自身,我该如何解决?

为啥缺少授权标头?

CSS3:为啥这个过渡不起作用,我该如何解决?