在一般情况下的Makefile编写为:
1
2
3
4
5
6
7
8all: arm-linux-gcc -c led.c arm-linux-ld led.o arm-linux-objcopy -O binary a.out boot.bin clean: $(RM) led.o a.out boot.bin
当变的比较复杂的情况下,使用变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19TGT := boot.bin SRCS := key.c CROSS_COMPILER := arm-linux- CC := $(CROSS_COMPILER)gcc LD := $(CROSS_COMPILER)ld OBJCPY := $(CROSS_COMPILER)objcopy CFLAGS := -ffreestanding LDFLAGS := all: $(CC) $(CFLAGS) -c $(SRCS) $(LD) $(LDFLAGS) $(SRCS:.c=.o) $(OBJCPY) -O binary a.out $(TGT) clean: $(RM) $(SRCS:.c=.o) a.out $(TGT)
举个栗子:
$(CC) $(CFLAGS) -c $(SRCS)
因为 CC := $(CROSS_COMPILER)gcc 而其中的CROSS_COMPILER := arm-linux-
所以:
$(CC) 就为 arm-linux-gcc
由CFLAGS := -ffreestanding ====》$(CFLAGS) 为 -ffreestanding
SRCS := key.c ==============》 $(SRCS)为 key.c
从而 $(CC) $(CFLAGS) -c $(SRCS) 按顺序填充 arm-linux-gcc -ffreestanding -c key.c
其实质就是变量代替
ffreestanding 解释参考这个博客
C编译器的两种实现标准
1.1 conforming freestanding implementation (裸机开发)
所谓的Freestanding,C编译器只需提供C语言语句的编译。在这种级别的编译器下写程序时,基本的printf都是不能够直接使用的。
此种实现,主要用于裸机开发,比如OS开发,bootloader,以及C库本身的开发
1.2 conforming hosted implementation (涉及操作系统)
这是一种更加全面的实现,除了包含Freestanding要求的功能外,必须包含完整的标准C库实现。这也是大多数应用程序员能接触到的环境。由于<stdio.h>中的输入输出函数的实现需要OS系统调用的支持,Hosted编译器都是依赖于具体的操作系统而存在。
总结
Hosted是比Freestanding更加全面的C实现要求,Hosted本身包含了Freestanding。例如Hosted的GCC实现,提供了-freestanding参数来作为Freestanding降级使用。
gcc -ffreestanding 这里就是Hosted(操作系统的标准中)使用-freestanding参数来实现GCC裸机编译标准。
最后
以上就是体贴冷风最近收集整理的关于裸机开发-Makefile文件的解析的全部内容,更多相关裸机开发-Makefile文件内容请搜索靠谱客的其他文章。
发表评论 取消回复