在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
#============================================================================#
在编译内核时,我们要使用交叉编译工具。后续会为单独写一篇,交叉工具链的安装。