gcc 警告“在 GCC 7.1 中更改了 X 的项目参数传递”是什么意思?

What does the gcc warning "project parameter passing for X changed in GCC 7.1" mean?

提问人:woggioni 提问时间:1/8/2018 最后编辑:Cœurwoggioni 更新时间:2/23/2020 访问量:35471

问:

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

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>::

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

C++ GCC

评论


答:

87赞 Sneftel 1/8/2018 #1

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

有关更改上下文的更多详细信息,请参阅 GCC 7 更改日志关联的 bug

评论

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