【问题标题】:How to use make and compile as C99?如何使用 make 和编译为 C99?
【发布时间】:2011-02-25 11:25:48
【问题描述】:

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

【问题讨论】:

标签: linux makefile c99 c89 kbuild


【解决方案1】:

这与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”来编译源文件。

【讨论】:

  • CFLAGS 比编辑编译器的每次调用更常见、更受欢迎且更不脆弱。
  • 在 OO (Java) 世界中生活了很长时间,最近又开始每天使用 C 语言之后,我不得不不同意将变量信息分离出来的观点。将事情保持在尽可能小的范围内似乎更重要。例如,某些变量仅在 while 或 for 循环内需要。
  • @powerj1984 在这种情况下,您可以使用大括号 {} 范围。 LukeN 在内核主线可以接受的内容中是正确的。这是否是一件好事,我不会说,我想这不是 OP 所要求的。
【解决方案2】:

你可以添加

CFLAGS=-std=c99

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

【讨论】:

    【解决方案3】:

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

    ccflags-y := -std=gnu99
    

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

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

    【讨论】:

    • 您好,我将 ccflags-y 添加到自己模块的 Makefile 中,但编译器仍然警告“ISO C90 禁止混合声明和代码”。为什么?
    • @basicthinker:也许this 有帮助
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多