gcc 警告“在 GCC 7.1 中为 X 传递的项目参数已更改”是啥意思?

Posted

技术标签:

【中文标题】gcc 警告“在 GCC 7.1 中为 X 传递的项目参数已更改”是啥意思?【英文标题】:What does the gcc warning "project parameter passing for X changed in GCC 7.1" mean?gcc 警告“在 GCC 7.1 中为 X 传递的项目参数已更改”是什么意思? 【发布时间】:2018-01-08 11:24:37 【问题描述】:

我有一个在 x86 Linux 和 Windows 上使用 gcc 7.2 构建良好且没有警告的 C++ 项目,我需要将它移植到 ARM 设备,所以我尝试使用“arm-linux-gnueabihf”gcc 7.2 交叉编译它在我的 x86 机器上运行,它可以构建,但我收到很多此类警告

note: parameter passing for argument of type '__gnu_cxx::__normal_iterator<P2d*, std::vector<P2d> >' changed in GCC 7.1
_M_realloc_insert(end(), __x);

/opt/armv7-gcc-2017/arm-linux-gnueabihf/include/c++/7.2.0/bits/vector.tcc:105:21: note: parameter passing for argument of type '__gnu_cxx::__normal_iterator<cpzparser::Anchor*, std::vector<cpzparser::Anchor> >' changed in GCC 7.1
    _M_realloc_insert(end(), std::forward<_Args>(__args)...);

/opt/armv7-gcc-2017/arm-linux-gnueabihf/include/c++/7.2.0/bits/vector.tcc:394:7: note: parameter passing for argument of type 'std::vector<cpzparser::PointEntity>::iterator aka __gnu_cxx::__normal_iterator<cpzparser::PointEntity*, std::vector<cpzparser::PointEntity> >' changed in GCC 7.1
       vector<_Tp, _Alloc>::

生成的可执行文件似乎工作正常,但我担心所有这些警告的存在,因为我不知道它们的含义.. 任何线索?

【问题讨论】:

【参考方案1】:

该警告告诉您在 6 和 7.1 之间存在细微的 ABI 更改(实际上是一致性修复),因此使用 6.x 或更早版本构建的库在从使用 7.x 构建的代码调用时可能无法正常工作(反之亦然)。只要您的所有 C++ 代码都是使用 GCC 7.1 或更高版本构建的,您就可以放心地忽略此警告。要禁用它,请将-Wno-psabi 传递给编译器。

有关更改上下文的更多详细信息,请参阅the GCC 7 changelog 和the associated bug。

【讨论】:

是否可以在系统范围的 GCC 配置中禁用此警告? @kyb 是的,您可以为此使用规范文件。但请不要。拥有与其他人的 GCC 不同的本地 GCC 只是自找麻烦。相反,将该选项添加到您的 Makefile 或 CMakeLists.txt 或您用于构建程序的任何其他内容中。 是的,我这样做了。谢谢你的回答 但是,如何解决呢?我的意思是,我需要更改代码才能获得此“注释”@Sneftel @ValentinoZaffrani 您没有需要更改,因为您的代码没有任何问题。您可以将有问题的函数参数更改为引用类型(更改仅影响按值传递的结构),但这很愚蠢。使用-Wno-psabi 禁用命令行上的警告,或根据this Q/A 在您的代码中禁用警告。

以上是关于gcc 警告“在 GCC 7.1 中为 X 传递的项目参数已更改”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用关于#warning 指令是 GCC 扩展的 GCC 警告?

GCC 不尊重“pragma GCC diagnostic”以消除警告 [重复]

禁用所有 gcc 警告

各个层次的gcc警告

GCC 警告

如何消除 GCC 中的外部库/第三方警告 [重复]