我正在尝试使用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?
答案 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”以编译源文件。