由于缺少一些标准库标头,使用GCC-11生成失败



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

当我开始研究它时,我从移植到GCC 11页中了解到;报头依赖性改变";部分,这是由于标准本身中的一些新规范而导致的一种新行为。

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

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

要克服这个
我手动将那些头文件包含在缺失的地方,构建刚刚成功。然而,当我使用不同的gcc版本针对某个C++版本进行构建时,我希望行为是一致的。或者,我是不是错过了什么?

多亏了JaMiT的注释,我意识到我把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.)

相关内容

  • 没有找到相关文章

最新更新