如何使用-std = gnu99编译Linux内核模块?

时间:2013-04-09 18:45:26

标签: c linux gcc linux-kernel c99

我最近学会了如何编写简单的字符驱动程序,在玩这些代码时,我注意到我的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选项我也会收到警告?

2 个答案:

答案 0 :(得分:18)

事实证明-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

答案 1 :(得分:-1)

您还可以在 Makefile 中指定标志(如果有):

FLAGS=-std=gnu99