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

概述

在一般情况下的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文件的解析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部