如何使用gcc和#pragma有选择地禁用-Werror

11

为了让我的应用程序尽可能少出现警告,我开始使用-Werror来告诉GCC将所有警告视为错误。

这对我很有帮助,因为在一个庞大的构建输出中有时会漏掉一两个(严重)警告。

不幸的是,我的项目使用SQLite 3,其中包含许多警告,正如SQLite网站上所述,这些警告无法消除(他们不想删除)。

我想知道是否有一种方法可以在sqlite3.c文件中放置一些#pragma来告诉GCC仅针对该文件停止将警告视为错误。

我尝试了:

#pragma GCC diagnostic ignored "-Werror"

但是没有成功。

我也尝试过逐个列出导致问题的警告:

#pragma GCC diagnostic ignored "-Wextra"
#pragma GCC diagnostic ignored "-Wfloat-equal"
#pragma GCC diagnostic ignored "-Wundef"
...

...不幸的是,有一些警告是无法完全关闭的(即,初始化舍弃指针目标类型的限定符)。

我该怎么办?


相关:https://dev59.com/llwY5IYBdhLWcg3w7rhX https://dev59.com/vbfna4cB1Zd3GeqPv5x2 https://dev59.com/43A75IYBdhLWcg3wSm64 - Jerry Jeremiah
1个回答

1
您可以在Makefile中为sqlite3.c添加一个额外的规则,以编译文件而不使用-Werror或没有任何警告。按照通常的惯例,可以使用类似于以下内容的代码:
sqlite3.o: sqlite3.c
    $(CC) $(CFLAGS) -w -c sqlite3.c

我曾经考虑过这个问题,但很遗憾我正在使用autoconf/automake...而且已经相当混乱了。警告(和-Werror)是在./configure期间选择的,因此我可以在为主机目标构建调试版本时启用它。然后,在为目标(嵌入式Linux)系统构建时禁用警告。 - fabrizi0
@fabrizi0 对于使用automake来为特定文件添加额外规则应该不会有问题。虽然我没有经验,但您可能需要查阅其文档以了解如何确切地执行此操作。请考虑将此标记为[tag:automake]并编辑您的问题以指出您是否希望获得一种禁用-Werror或为一个文件提供-w的方法,以便获得相应的答案。 - fuz
1
FUZxxl:不幸的是,正如我所怀疑的那样,automake不支持每个对象标志,只支持每个目标标志。正如在这篇文章中提到的:https://dev59.com/XkXRa4cB1Zd3GeqPq1m4。如果我找不到任何好的方法来针对每个文件进行操作,我将不得不创建一个sqlite库并将我的应用程序链接到它。 - fabrizi0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接