基本Makefile编写---致我的第一个Makefile

对于一个经常使用Keil来编译程序得人来说Makefile还是很神秘的,特别是看了一些Makefile的文档(比较推荐的是跟我一起写makefile,可以把这个文档当做字典来用,可以先粗略看一遍),看的都是比较头晕的(但真正用起来了觉得Makefile还是不是太复杂的)。

下面就来说下我的第一个Makefile,初次写Makefile可以在网上搜一下模板,模板有很多注意刷选,有的是用来编译静态库的,有的是用来编译生成交叉编译的.bin文件的,因为用到的是交叉编译环境下编译AMR9上的程序,所以,找了一个编译生成elf、.bin的模板。

另外,建立交叉编译环境需要特别注意的是选择一个正确的工具链(我是选的是一个ARM9开发板自带的工具链,省去了选工具链的时间)。

其次,在使用Makefile之前我是使用make脚本来实现编译的(过程更加的麻烦)脚本如下:

OPTIMIZE="-O2"
#########################################
#
#    build applications
#
########################################
cd bulid/applications
rm *.o
arm-none-linux-gnueabi-gcc -c -g  -I../../include -I../../include/bsp -I../../include/libc -I../../include/arm926 -mlittle-endian -march=armv5te -mno-thumb-interwork -ffreestanding -Wall -fno-builtin -nostdinc ../../applications/startup.s
arm-none-linux-gnueabi-gcc -c -g  -I../../include -I../../include/bsp -I../../include/libc -I../../include/arm926 -mlittle-endian -march=armv5te -mno-thumb-interwork -ffreestanding -Wall -fno-builtin -nostdinc ../../applications/main.c

#########################################
#
#    build bsp
#
########################################
cd ../bsp
rm *.o
arm-none-linux-gnueabi-gcc -c -g  -I../../include -I../../include/bsp -I../../include/libc -I../../include/arm926 -mlittle-endian -march=armv5te -mno-thumb-interwork -ffreestanding -Wall -fno-builtin -nostdinc ../../bsp/system_init.c
arm-none-linux-gnueabi-gcc -c -g  -I../../include -I../../include/bsp -I../../include/libc -I../../include/arm926 -mlittle-endian -march=armv5te -mno-thumb-interwork -ffreestanding -Wall -fno-builtin -nostdinc ../../bsp/uart.c

########################################
#
#    output image
#
########################################
cd ../..
rm -f  output/*

arm-none-linux-gnueabi-ld -Bstatic -Map output/rtt_zq1.map --fix-v4bx --strip-debug -o output/rtt_zq1.elf \
                                -T zq1.ld bulid/applications/*.o bulid/bsp/*.o 

arm-none-linux-gnueabi-objcopy -O binary  output/rtt_zq1.elf output/rtt_zq1.bin

arm-none-linux-gnueabi-objdump -D output/rtt_zq1.elf > output/rtt_zq1.S



size output/rtt_zq1.elf

使用时候./make来运行编译(具体的实现就是源码里的代码了,应该很容易看懂,但是对于很大的工程来说,这样会很麻烦的一种方法)。

下面进去Makefile。进入正文先把Makefile贴上来

SRCSS = $(wildcard applications/*.s)
SRCS = $(wildcard  applications/*.c bsp/*.c) #wildcard把 指定目录 ./ 和 ../lib 下的所有后缀是c的文件全部展开。

#OBJS将$(SRCS)下的.c文件转化为.o文件
OBJSS = $(SRCSS:.s=.o)
OBJS = $(SRCS:.c=.o)   


CC = arm-none-linux-gnueabi-gcc   #代表所使用的编译器
LD = arm-none-linux-gnueabi-ld
OBJCOPY = arm-none-linux-gnueabi-objcopy
OBJDUMP = arm-none-linux-gnueabi-objdump
SIZE = size

#头文件查找路径
INCLUDES = -I include/ -I include/bsp/ -I include/bsp/ -I include/libc/ -I include/arm926/ -I include/uart/

#LIBS = -L../lib \   #链接库查找地址

CCFLAGS = -g -mlittle-endian -march=armv5te -mno-thumb-interwork -ffreestanding -Wall -fno-builtin -nostdinc   #附加参数

OUTPUT = rtt_zq1.bin


all:$(OUTPUT)

$(OUTPUT):rtt_zq1.elf
	$(OBJCOPY) -O binary  $^ $@

rtt_zq1.elf:$(OBJSS) $(OBJS)
	echo $(OBJSS)
	$(LD) -Bstatic -Map rtt_zq1.map --fix-v4bx --strip-debug  -o  $@ -T zq1.ld $^ 

%.o : %.s
	$(CC) -c $(CCFLAGS) $<  -o $@

%.o : %.c
	$(CC) -c $(INCLUDES) $(CCFLAGS) $<  -o $@

clean:
	rm -rf *.elf *.o *.bin *.map $(OBJSS) $(OBJS)  #清除中间文件及生成文件

.PHONY:clean

1、有注释对的地方就不多说了,Makefile的依赖关系为从上到下的,越往下越是实现的具体命令,前面的目标依赖后面的依赖文件,后面的依赖文件依赖下面的目标。。。如此,从上到下依次寻找文件。

2、

SRCS 相当于宏定义文件的路径,我这里因为有汇编的.S文件,所以,有两个这种的类型(SRCSS,SRCS),
OBJS 相当于生成的目标文件,具体生成在 
%.o : %.s
	$(CC) -c $(CCFLAGS) $<  -o $@

%.o : %.c
	$(CC) -c $(INCLUDES) $(CCFLAGS) $<  -o $@

这两行

3、其中,使用到最多的几个符号在这里说一下

1) $@ ——目标文件的名称;
(2) $^ ——所有的依赖文件,以空格分开,不包含重复的依赖文件;
(3) $< ——第一个依赖文件的名称。

示例:
main:main.c sort.o
    gcc main.c sort.o -o main
表示为简洁的就是:
main:main.c sort.o
    gcc $^ -o $@

目标文件:依赖文件1 依赖文件2(Makefile格式)

就是说$@就表示它的上一行的目标文件的名称,$^表示上一行的所有依赖文件,$<上一行的第一个依赖文件

4、还有需要注意的地方是,如果make不成功,出现错误,那么大部分的原因是自己的写的符号有问题,一定要仔细仔细的检查。里面用到的

echo $(OBJSS)

是用来打印东西的,这样可以很好地调试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值