.PHONY:
clean
#******工具链说明****/
#arm-linux-* 和 arm-elf-*区别主要表现在C语言库的实现上,例如不同系统调用,不同的函数集实现,不同的ABI启动代码以及不同系统特性等微小的差别。
#arm-linux-*和 arm-elf-*的使用没有一个绝对的标准,排除不同库实现的差异,gcc可以编译任何系统。arm-linux-*和 arm-elf-*都可以用来编译裸机程序和操作系统,只是在遵循下面的描述时系统程序显得更加协调:
#arm-linux-*针对运行linux的ARM机器,其依赖于指定的C语言库Glibc,因为同样使用Glibc的linux而使得arm-linux-*在运行linux的ARM机器上编译显得更加和谐。
#arm-elf-*则是一个独立的编译体系,不依赖于指定的C语言库Glibc,可以使用newlib等其他C语言库,不要求操作系统支持,当其使用为嵌入式系统而设计的一些轻巧的C语言库时编译裸机程序(没有linux等大型操作系统的程序),如监控程序,
#bootloader等能使得系统程序更加小巧快捷。
CC = gcc
LD = ld
AR = ar
RM = rm
OBJDUMP = objdump
#-nostdinc
CFLAG = -I$(INC_DIR) -I$(SRC_DIR) -Wall -g -O2
ALL = target
_SRCS_LIST = \
test.c
DIR = .
INC_DIR =$(DIR)/include
SRC_DIR =$(DIR)/source
OBJ_DIR = $(DIR)/Obj
_OBJS = $(addprefix $(OBJ_DIR)/, $(basename $(_SRCS_LIST)))
OBJS = $(addsuffix .o, $(_OBJS))
#自动化变量
# $< 第一个依赖文件的名称=======一般单独编译是用
# $@ 目标的完整名称*****
# $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件******
# $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚
$(ALL) : $(OBJS)
$(CC) -static $^ -o $@
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
$(CC) $(CFLAG) -c $^ -o $@
clean:
$(RM) -rf $(ALL) $(OBJ_DIR)/*