【问题标题】:How to disable specified warning for specified file while using autotools?使用自动工具时如何禁用指定文件的指定警告?
【发布时间】:2012-04-23 06:02:10
【问题描述】:

我使用自动工具来管理我的 CPP 项目。编译我的代码时,gcc 有这些标志:-Wall -Werror

所以,当我的代码中出现警告时,gcc 会将其视为错误,编译将被中断。

我的项目还包括 antlr3,它会生成几个文件。生成的文件包含几个警告,这些警告会中断编译。

error: unused variable ‘index21_49’
in CongerCQLLexer.c, line 20589, column 24
20587>                 ANTLR3_UINT32 LA21_49;
20588> 
20589>                 ANTLR3_MARKER index21_49;
20590> 
20591> 

error: unused variable ‘index21_131’
in CongerCQLLexer.c, line 20622, column 24
20620>                 ANTLR3_UINT32 LA21_131;
20621> 
20622>                 ANTLR3_MARKER index21_131;
20623> 
20624> 

我想知道如何禁用生成文件的警告? 谢谢。

【问题讨论】:

  • 不幸的是,似乎无法为单个源文件设置标志,只能为单个可执行文件设置标志。请参阅this old SO 回答如何做到这一点。另请参阅automake 手册here
  • -Wall -Werror 默认包含在项目的构建系统中是一个非常糟糕的主意。即使它在您系统上的 gcc 版本 X 上编译得很好,它可能无法在最终用户系统上的 gcc 版本 Y 上编译。 gcc 一直在添加新的警告,并且用户系统的特征(例如系统头文件的差异)可能会导致一些您没有预料到的警告。我只会在本地启用 -Werror,绝不会在您发布的默认构建系统中启用。
  • 顺便说一句,GNU binutils最近打破了这个原则,每次我构建它时,由于-Werror而失败,我必须返回并重新运行配置@987654328 @删除。这是一个巨大的痛苦......

标签: c makefile antlr autotools


【解决方案1】:

答案很大程度上取决于您如何将-Wall -Werror 纳入构建。如果您直接在 configure.ac 中分配 CFLAGS,解决方案是停止这样做。 CFLAGS 是一个用户变量,只能由用户分配。如果您在AM_CFLAGS 中设置它们,则可以改为通过foo_CFLAGS 将它们仅添加到特定文件中。但是,将-Wall -Werror 分配给 CFLAGS 是一个坏主意,原因有几个,其中之一是并非所有编译器都接受这些标志。您是否希望构建因“-Werror -- 未知选项”而死?尽管许多(大多数?)编译器确实接受-Wall -Werror,但关键是您不知道您的用户正在使用什么编译器,并且您不知道-Werror 是否有用甚至被接受,您也不知道用户希望设置这些标志。让用户决定。

Automake 在配置时为特定翻译单元定义标志方面没有提供太多粒度,但是添加一个用户可以分配的变量将用于所有非构建源,以及另一个对于构建的源。用户可以分配 BUILT_CFLAGS,而不是分配 CFLAGS,您可以将它们添加到 foo_CFLAGS 以获得适当的 foo 值。通常对此的解决方案是什么都不做,让用户进行必要的调整(即,用户将在 CFLAGS 中使用 -Werror 进行构建,看到构建失败,然后在没有 -Werror 的情况下进行重建。)

【讨论】:

    【解决方案2】:

    我认为在每个文件的基础上实现您想要的最佳方法是使用 GCC 编译指示来禁用受影响文件中的警告。有关详细信息,请参阅关于 SO 的此问题/答案:

    https://stackoverflow.com/a/3394305/379897

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多