概述
在一般情况下的Makefile编写为:
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
当变的比较复杂的情况下,使用变量:
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文件的解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复