由于缺少某些标准库标头,使用 GCC-11 构建失败

Build Fails Using GCC-11 Due to Some Missing Standard Library Headers

提问人:Analytiker 提问时间:9/9/2022 最后编辑:Analytiker 更新时间:9/16/2022 访问量:682

问:

升级到 Ubuntu 22.04 附带的 gcc-11 后,由于缺少一些标准库头文件,我开始出现新的编译器错误。而以前的 gcc 版本则没有。

当我开始研究它时,我从移植到 GCC 11 页面的“标头依赖项更改”部分下了解到,由于标准本身的一些新规范,这是一种新行为。

现在,我的问题是:特定C++标准(即C++17)的实现是否从一个gcc版本更改为另一个gcc版本(即gcc-9和gcc-11)?我的意思是,如果我使用不同的 gcc 版本但针对相同的 C++ 标准版本(即 -std=c++17)进行构建,构建怎么会失败?

C++ 标准库的新要求 - 不包括库内部使用的其他标头 - 是 C++17 或 C++20 的一部分吗?

为了克服这个问题......
我手动包含了那些缺少的头文件,并且构建刚刚成功。 但是,当我针对具有不同 gcc 版本的某个 C++ 版本进行构建时,我希望行为是一致的。或者,我错过了什么?

C++ GCC 标准 Ubuntu-22.04 GCC11

评论

0赞 user253751 9/9/2022
IIRC 标头被允许声明标准没有说他们应该说的内容,只要它们声明它所说的所有内容。
0赞 Jesper Juhl 9/9/2022
当然,特定标准的实现可以从一个编译器版本更改为下一个编译器版本。错误得到修复,缺失的功能得到添加,等等。
1赞 JaMiT 9/10/2022
“由于标准本身的一些新规范。”-- 我在您的链接资源中没有看到这一点。根据我的阅读,这种变化是由于实现标准的的变化,而不是对标准的变化。是什么让您认为标准发生了变化?

答:

0赞 Analytiker 9/16/2022 #1

多亏了 JaMiT note,我意识到我弄错了 GCC 的笔记。 在 GCC 11 中,只是他们对标准的实施发生了变化,而不是标准本身。

当您仔细阅读该文章中的引用部分时,您可以看到这一点。

标头依赖项更改

某些 C++ 标准库标头已更改为不再 包括库内部使用的其他标头。 因此,使用标准库组件的 C++ 程序没有 包含正确的标头将不再编译。

以下标头在 libstdc++ 中使用较少,可能需要 在使用 GCC 11 编译时明确包含:

<limits>  (for std::numeric_limits)
<memory>  (for std::unique_ptr, std::shared_ptr etc.)
<utility> (for std::pair, std::tuple_size, std::index_sequence etc.)
<thread>  (for members of namespace std::this_thread.)