出现使用选项-std=c99或-std=gnu99来编译您的代码错误或者如何让Linux内核编译驱动模块时支持C99
最近在Linux系统下编译嵌入式代码时出现问题:问题如下图:然后发现问题出在这:use option -std=c99 or -std=gnu99 to compile your code上面的意思是:使用选项-std=c99或-std=gnu99来编译您的代码后来才知道:gcc 默认使用的是 C89 的标准,而 C89 的标准不支持在 for 中定义循环变量,而在 for 循环中需要定义循环变量
·
最近在Linux系统下编译嵌入式代码时出现问题:
问题如下图:
然后发现问题出在这:
use option -std=c99 or -std=gnu99 to compile your code
上面的意思是:使用选项-std=c99或-std=gnu99来编译您的代码
后来才知道:gcc 默认使用的是 C89 的标准,而 C89 的标准不支持在 for 中定义循环变量,而在 for 循环中需要定义循环变量的话,需要在 C99 标准中才支持,因此需要增加 -std=c99 或 -std=gun99 参数才能编译通过。
所以在嵌入式中使用的交叉编译器在编译时加上–std=c99选项可以支持c99
arm-linux-gnueabihf-gcc test.c -o test --std=c99
然后问题解决:
但是如果在你是在让内核编译驱动模块的时候,并没有使用上述语句的机会,不过我们可以在内核模块的Makefile文件中加入下面这句话让其支持c99
ccflags-y := -std=gnu99 -Wno-declaration-after-statement
内核模块Makefile示例如下(源文件test.c):
KERNEL_DIR := /home/xxx/xxx
CURRENT_DIR := $(shell pwd)
obj-m := test.o
ccflags-y := -std=gnu99 -Wno-declaration-after-statement
kernel_module:
$(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
.PHONY:clean
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
更多推荐
已为社区贡献3条内容
所有评论(0)