在Linux系统下使用gcc编译器编译一个C语言文件时,我们可以输入:gcc -o a a.c来完成。更详细的编译过程可以分为:
第一步:预处理生成预处理文件(.i)
gcc -E a.c -o a.i
第二步:编译生成汇编文件(.s)
gcc -S a.i -o a.s
第三步:汇编生成目标文件(.o)
gcc -c a.s -o a.o
第四步:链接生成可执行文件
gcc a.o -o a
当我们有多个文件需要编译链接时,如果我们再使用上述的过程就变的非常麻烦。此时,我们便需要一个工具来帮我们简单化上述过程。这个工具就是Makefile文件。
在一个大型的大型软件工程项目下,Makefile与整个工程的编译规则有很大的关系。在大型软件工程下,源文件不计其数,按类型、功能、模 块分别放在若干个目录中,文件编译的先后顺序,甚至进行更复杂的操作,就需要Makefile进行一系列的规则定义。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。Make是一个命令工具,是一个解释makefile中指令的命令工具。
现在,就对我们上次提到的Makefile文件进行一些解释:
# CORTEX-A8 PERI DRIVER CODE # VERSION 2.0 # ATHUOR www.dev.hqyj.com # MODIFY DATE #2013.03.28 Makefile CROSS_COMPILE=arm-cortex_a8-linux-gnueabi- (指定交叉编译) NAME=rtc #=============================================================================# CFLAGS += -g -c -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp -fno-builtin \ -nostdinc -I ../common/include(内嵌函数路径) LD = $(CROSS_COMPILE)ld(链接) CC = $(CROSS_COMPILE)gcc(编译汇编) OBJCOPY = $(CROSS_COMPILE)objcopy(编译成二进制文件) OBJDUMP = $(CROSS_COMPILE)objdump(反编译器) #============================================================================# OBJSss := $(wildcard ../common/start/*.S) $(wildcard ../common/start/*.c) $(wildcard ../common/src/*.c) \ $(wildcard ../common/src/*.S) $(wildcard *.c) $(wildcard *.S) OBJSs := $(patsubst %.S(要替换谁),%.o(替换成什么),$(OBJSss)(替换路径)) (通配替换) OBJS := $(patsubst %.c,%.o,$(OBJSs)) #============================================================================# %.o: %.S $(CC) $(CFLAGS) -c -o $@ $< all:clean $(OBJS) $(LD) $(OBJS) -T ../common/map.lds -o $(NAME).elf(elf文件包含程序的标识型信息) $(OBJCOPY) -O binary $(NAME).elf $(NAME).bin $(OBJDUMP) -D $(NAME).elf > $(NAME).dis cp ./rtc.bin /tftpboot #============================================================================# clean: rm -rf $(OBJS) *.elf *.bin *.dis *.o #============================================================================#在编译内核时,我们要使用交叉编译工具。后续会为单独写一篇,交叉工具链的安装。