cc1plus:任何其他警告均出现无法识别的命令行选项警告

Fla*_*ire 6 c++ g++ compiler-warnings suppress-warnings

我有一个奇怪的 g++ 行为,当显示任何其他警告时,它会显示有关无法识别的命令行选项的警告。

\n\n

例子:

\n\n
struct Foo{virtual int bar() = 0;};\nstruct Bar:public Foo{int bar() {return 0;} };\n\nint main(){}\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译g++-5 -Wsuggest-override -Wno-c99-extensions -std=c++11 a.cpp甚至g++-5 -Wsuggest-override -Wno-c99-extensions a.cpp显示:

\n\n
a.cpp:2:27: warning: \xe2\x80\x98virtual int Bar::bar()\xe2\x80\x99 can be marked override [-Wsuggest-override]\n struct Bar:public Foo{int bar() {return 0;} };\n                           ^\ncc1plus: warning: unrecognized command line option \xe2\x80\x98-Wno-c99-extensions\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

添加:当我编译时没有警告/错误,g++-5 -Wno-c99-extensions a.cpp因此该选项通过使用 CMAKE 检查CHECK_CXX_COMPILER_FLAG

\n\n

这让我很困扰,因为我们使用 Werror 但通过 Wno-error=... 出现异常,然后当任何(非错误)警告显示为“无法识别的命令行选项”时,它就会退出

\n\n

这是已知的/预期的吗?如何预防?

\n

Lig*_*ica 2

如果您不想收到有关无法识别的命令行选项的警告,请不要使用无法识别的命令行选项:-Wno-c99-extensions从来都不是有效的 GCC 选项(我相信这是一种铿锵声)。只需将其从构建命令中删除即可。

至于为什么只有在出现另一个警告时才会发出警告,这种行为似乎违反直觉,但实际上是故意的并记录在案

-Wno-foo 未给出警告“无法识别的命令行选项”

从 GCC 4.4 开始,正如 GCC 手册中所解释的:当请求无法识别的警告选项时 ( -Wunknown-warning),GCC 会发出一个诊断,指出该选项无法识别。但是,如果-Wno-使用该表单,则行为会略有不同:-Wno-unknown-warning除非正在生成其他诊断信息,否则不会生成任何诊断信息。这允许旧编译器使用新-Wno-选项,但如果出现问题,编译器会警告存在无法识别的选项。(有关此更改的历史记录,请参阅 PR28322)

这可能会破坏检查-Wno-foo选项的配置测试。解决方案是测试肯定形式 ( -Wfoo) 或使用触发某些其他警告的测试用例进行测试。

事实上,Google 上的邮件列表线程有一些结果,其中软件开发人员遇到了这个“问题”,特别是使用 CMake,并对他们的构建脚本进行了一些简单的修复以“修复”它。

  • 当您将 CMake 用于多平台/多编译器项目时,您会关心。当然,您可以检查每个编译器并根据该编译器及其版本添加标志。但这很容易变得非常大并且容易出错。这是“CHECK_CXX_COMPILER_FLAG”的用例之一,但由于行为不一致而失败。 (3认同)