使用GCC-11构建时由于缺少一些标准库头文件而失败

dhxwm5r4  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(254)

在升级到gcc-11(Ubuntu 22.04附带的)之后,我开始收到新的编译器错误,因为缺少一些标准库头文件,而以前的gcc版本没有。
当我开始研究它时,我从Porting to GCC 11页面的“Header dependency changes”部分了解到,这是一个新的行为,是由于标准本身中的一些新规范。
现在,我的问题是:特定C标准(例如C17)的实现是否会从一个gcc版本更改为另一个gcc版本(例如gcc-9和gcc-11)?我的意思是,如果我使用不同的gcc版本但针对相同的C标准版本(例如-std=c17)进行构建,构建会失败吗?
C标准库是否是C17或C20的新要求--不包括库内部使用的其他头文件?
"为了克服这一切"
我在缺少头文件的地方手动添加了这些头文件,构建刚刚成功。但是,我希望在使用不同的gcc版本构建特定的C
版本时,行为是一致的。或者,我缺少了什么?

nkoocmlb

nkoocmlb1#

多亏了JaMiT的注解,我意识到我从GCC得到的注解是错误的。在GCC 11中,只是他们对标准的实现发生了变化,而不是标准本身。
当您彻底阅读that article中引用的部分时,您可以看到这一点。

标头相关性更改

某些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.)

相关问题