22

我正在尝试使用 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?

4

3 回答 3

22

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

ccflags-y := -std=gnu99

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

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

于 2011-04-04T19:53:08.193 回答
19

你可以添加

CFLAGS=-std=c99

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

于 2011-01-16T02:30:31.790 回答
-8

它与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”。

于 2010-05-29T12:42:45.837 回答