11

我最近学习了如何编写简单的字符驱动程序,并且在玩弄代码时我注意到我收到很多针对我的 C99 代码的以下 GCC 警告:

warning: ISO C90 forbids mixed declarations and code

我认为这是因为主 Linux 内核 Makefile 设置为使用非 C99 标准进行编译。我四处搜索我在stackoverflow上找到了这个答案:How to use make and compile as C99?

所以我很自然地在我的 Makefile 中尝试了以下内容:

ccflags-y := -std=gnu99

不幸的是,这并没有消除 GCC 警告。我检查了详细的输出make并验证了 GCC 确实是-std=gnu99在最后执行的;所以我有点困惑。

如何使用该-std=gnu99选项正确编译 Linux 内核模块?

编辑

我注意到 GCC 输出显示了这个选项:-Wdeclaration-after-statement. -std=gnu99这就是为什么即使使用该选项我也会收到警告?

4

2 回答 2

20

事实证明这-std=gnu99 确实有效;删除编译器标志后,我开始看到有关 C99 功能的错误。-std=所以这意味着除了选项之外还有其他东西导致警告打印出来。

通过 解析详细输出后make V=1,我发现该-Wdeclaration-after-statement选项是 GCC 执行的一部分。这就是我看到的 ISO C90 混合声明警告的原因。

要禁用 ISO C90 警告,请将其传递给 GCC -Wno-declaration-after-statement:.

例如:

ccflags-y := -std=gnu99 -Wno-declaration-after-statement
于 2013-04-09T20:38:41.853 回答
0

如果您有一个,您还可以在Makefile中指定标志:

FLAGS=-std=gnu99
于 2014-09-26T21:29:53.417 回答