我有一个C++项目,可以在x86 Linux和Windows上使用gcc 7.2进行构建,并且没有警告,我需要将它移植到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);
Run Code Online (Sandbox Code Playgroud)
和
/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)...);
Run Code Online (Sandbox Code Playgroud)
要么
/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>::
Run Code Online (Sandbox Code Playgroud)
生成的可执行文件似乎工作正常,但我担心所有这些警告的存在,因为我不知道他们的意思..任何线索?
在我的项目中,我收到许多形式为“注意:当启用 C++17 时,类型为‘SomeClass<int, float>’的参数传递更改为与 GCC 10.1 中的 C++14 匹配”的警告。在我更新为使用使用 C++17 标准而不是 C++14 的编译器(来自 Arm GNU 工具链 v11.2 的 gcc-arm-none-eabi)之后,发生了这种情况。
据我所知,此注释指的是纠正涉及传递特定 C++ 模板对象的错误的更改。如果我错了,请纠正我的理解,但我认为我不需要注意注释,因为我使用示例编译器(gcc 11.2)编译项目中的所有依赖项,因此不应该有任何 ABI 差异。因此,我想摆脱这些淹没终端时出现的注释。我找到了一些可能的解决方案:
设置 -Wno-psabi 标志
这有效并将禁用所有 psABI 警告。但是,有时我确实希望收到有关 ABI 更改的通知,如此处所述(GCC 的 -Wpsabi 选项究竟是做什么的?抑制它的影响是什么?)。然而,这个问题的答案也指出,如果我的程序的所有部分都是使用相同的编译器构建的,我永远不需要担心 ABI 更改。我认为我的项目就是这种情况,并且想要确认 - 除了 libstd++ 和 newlib 之外,所有库和应用程序本身都是使用 gcc 11.2 编译的。
-f比较调试第二个
这神奇地让笔记消失了,但我不确定如何或为什么。手册页指出“当将此选项传递给编译器驱动程序时,它会导致跳过第一次编译,这使得它除了调试编译器之外几乎没有什么用处。” (https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html)这似乎会导致第一个编译传递被跳过,并且只会显示第二个编译传递的输出,这意味着我执行的警告和其他输出想看的可能不会出现?因此我也对使用这个感到担心。
找到某种方法来消除有关 C++14 和 C++17 之间 ABI 参数传递更改的所有注释,但仍启用其他注释
这就是我真正想做的,但不确定是否有办法。
当我使用GCC 4.7编译我的程序时,我得到以下注释:
/usr/include/c++/4.7/backward/binders.h:167:5: note: the ABI of passing structure with complex float member has changed in GCC 4.4 here
Run Code Online (Sandbox Code Playgroud)
有没有办法摆脱它?我试图谷歌它,但我找到的只是打印注释字符串的GCC源代码行.