我是靠谱客的博主 体贴冷风,这篇文章主要介绍裸机开发-Makefile文件的解析,现在分享给大家,希望可以做个参考。

在一般情况下的Makefile编写为:

复制代码
1
2
3
4
5
6
7
8
all: 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
19
TGT := 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文件内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部