裸机开发-Makefile文件的解析

本文介绍了在裸机开发中Makefile的使用,特别是如何通过$(CC)、$(CFLAGS)和$(SRCS)变量进行编译。CFLAGS设置为-ffreestanding,使得编译器成为一个conforming freestanding implementation,适用于没有操作系统支持的环境,如OS开发、bootloader。同时,对比了conforming hosted implementation,它包含了完整的标准C库,通常用于依赖操作系统的应用程序。
摘要由CSDN通过智能技术生成

在一般情况下的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裸机编译标准。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHULINHAIBAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值