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

我最近学会了如何编写简单的字符驱动程序,并且在使用代码的同时,我注意到我的C99代码中出现了很多下面的GCC警告:

warning: ISO C90 forbids mixed declarations and code 

我认为这是因为主要的Linux内核Makefile被设置为使用非C99标准进行编译。 我周围search我在这里find了这个答案在stackoverflow: 如何使用make和编译为C99?

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

 ccflags-y := -std=gnu99 

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

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

编辑

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

Solutions Collecting From Web of "如何使用-std = gnu99编译Linux内核模块?"

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

你也可以在你的Makefile中指定标志,如果你有一个:

 FLAGS=-std=gnu99