最近在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
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐