如何使用make和编译为C99?

时间:2010-05-29 12:38:18

标签: linux makefile c99 c89 kbuild

我正在尝试使用Makefile编译linux内核模块:

obj-m += main.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

这给了我:

main.c:54: warning: ISO C90 forbids mixed declarations and code

我需要切换到C99。阅读后我注意到我需要添加一个标志-std = c99,不确定它在哪里添加。

如何更改Makefile以便编译为C99?

3 个答案:

答案 0 :(得分:18)

在编译模块时添加编译器标志的正确方法是设置ccflags-y变量。像这样:

ccflags-y := -std=gnu99

有关详细信息,请参阅内核树中的Documentation/kbuild/makefiles.txt

请注意,我使用gnu99标准而不是c99,因为Linux内核严重依赖于GNU扩展。

答案 1 :(得分:14)

你可以添加

CFLAGS=-std=c99

makefile的顶部,或者您可以使代码符合C90(正如LukeN建议的那样。)

答案 2 :(得分:-6)

这与makefile无关。 ISO C90禁止在块或文件的开头任何地方声明变量 - 比如

int main(int argc, char **argv) {
   int a; /* Ok */
   int b = 3; /* Ok */

   printf("Hello, the magic number is %d!\n", b);
   int c = 42; /* ERROR! Can only declare variables in the beginning of the block */
   printf("I also like %d.. but not as much as %d!\n", c, b);

   return 0;
}

因此必须将其修改为......

int main(int argc, char **argv) {
   int a; /* Ok */
   int b = 3; /* Ok */
   int c = 42; /* Ok! */

   printf("Hello, the magic number is %d!\n", b);
   printf("I also like %d.. but not as much as %d!\n", c, b);

   return 0;
}

您只能在源代码中“修复”它,而不能在makefile中“修复”。

这条规则已在C99中放宽,但在我看来,将变量定义,声明和初始化与其下面的代码分开是个好主意:)

因此,要更改makefile以使其使用C99进行编译,您需要更改makefile引用的“build”目录中的Makefile,并在“gcc”行中添加“-std = c99”以编译源文件。