提问人:Analytiker 提问时间:9/9/2022 最后编辑:Analytiker 更新时间:9/16/2022 访问量:682
由于缺少某些标准库标头,使用 GCC-11 构建失败
Build Fails Using GCC-11 Due to Some Missing Standard Library Headers
问:
升级到 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++ 版本进行构建时,我希望行为是一致的。或者,我错过了什么?
答:
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.)
评论