Linux驱动开发(二)——Makefile简介

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

猜你喜欢

转载自blog.csdn.net/qq_38697681/article/details/79753982