我最近接手了一个很大很老的项目,它编译起来没有问题,但是因为代码太老了,以前的开发人员并不总是按照他们应该做的方式来做事情,所以我在使用现代编译器时收到了很多警告。
现在我修改了部分代码,有时会引入错误。当我重新编译项目时,会出现很多警告输出,在输出的末尾,我看到这样的消息:
SomeFile.C:3426:51: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
SomeCode("Some String");
^
SomeFile.C:3429:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
SomeCode("Some Other String");
^
make[2]: *** [SomeFile.o] Error 1
make[2]: Leaving directory `/some/path/of/a/source/directory/somesubdirectory'
make[1]: *** [somesubdirectory] Error 2
make[1]: Leaving directory `/some/path/of/a/source/directory'
make: *** [directory] Error 2
BUILD FAILED (exit value 2, total time: 2s)
还有上面的很多警告(我只是展示了几十个列表中的两个)。
真实的的错误显示在上面数百行,内容如下:
SomeFile.C: In function 'void someFunction()':
SomeFile.C:891:5: error: 'someIdentifier' was not declared in this scope
someIdentifier->someMoreStuff->someMethod(someArgs);
^
我现在的问题是找到错误信息。如果我能关闭警告就很容易了,因为这样错误信息就会是最后打印的东西。
那么,有没有办法告诉编译器不要给予任何警告,或者至少在最后打印错误消息(这就足以解决我的问题了)?
我想用尽可能少的补丁工作来解决这个问题,所以修复所有发出警告的代码或多或少是不可能的,特别是因为我最终要扔掉它的大部分,只保留一个我想提取的特性。
但是我可以修改所有的文件(可能在开始的时候用find
和sed
插入一个#pragma
或#define
或类似的文件),我也可以在所有的目录中修补Makefile
。但是,如果能够在不需要修补太多的情况下关闭和打开解决方案,那就太好了(如果可能的话,我不想要求太多)。
我找到并尝试了一些关于禁止警告的信息,例如this here,但是使用-i
(或-isystem
)或#pragma GCC system_header
选项似乎不起作用,可能是因为被警告的文件是命令行中给出的文件,而不是包含的文件。#pragma
因此被警告。
2条答案
按热度按时间s3fp2yjn1#
您可以设置
gcc -w
以禁止所有警告消息。8i9zcol22#
你可以从命令行控制GCC警告。warning options有很好的文档记录。大多数选项以“-W”开始,每个选项都有一个“no”等价项。你可以使用
-Wno-shadow
来禁用与这类阴影问题相关的警告。您可能还想给予一下Clang; better diagnostics是它的主要优点之一。