一个Makefile
开始学习Makefile决定怒艹之
从简单到难,从复杂到简易
此Makefile特点:
小巧简单,适合多目录,多嵌套目录 .
产生o文件及其它文件到指定目录中,使源文件目录不受“污染”
如果你的工程目录跟此并不是一致,大多数情况应该可以做少量修改就可以使用
如果有朋友对此有好的建议,非常欢迎。
目录结构为:
--test
--bin
--a.out
--depend
--add.d
--main.d
--lib
--add.c
--add.h
--Makefile
--main
- -main.c
--Makefile
--obj
--add.o
--main.o
--Makefile
说明:黑色加粗字体表示文件夹 . 蓝色字体表示文件
下面分别顺序说明主目录中的Makefile和子目录中的Makefile写法
1.主目录下的Makefile内容为:
#工程设置 分别是顶层目录 最终结果目录,OBJ文件目录,依赖文件depend目录, #头文件搜索路径选项,编译器选项,编译器 export TOPDIR = $(CURDIR) export BINDIR = $(TOPDIR)/bin export OBJDIR = $(TOPDIR)/obj export DEPENDDIR = $(TOPDIR)/depend INCLUDE = -I. -I$(TOPDIR)/lib export CFLAGS = -c $(INCLUDE) export CC = gcc ###### #子目录 如果子目录很多可以用shell命令来动态赋值给SUBDIR SUBDIR = main lib #在OBJ目录下的o文件,这些文件是由SUBDIR产生的,这里最后将它们链接起来输出 #执行文件 OBJS = $(wildcard $(OBJDIR)/*.o) #执行文件名称 BIN = $(BINDIR)/a.out .PHONY : all subdir clean all : subdir subdir : #依次遍历执行各个子目录中Makefile的all目标 $(foreach dir,$(SUBDIR),$(MAKE) -C $(dir) all;) #调用link进行链接 $(MAKE) link link : $(CC) $(OBJS) -o $(BIN) #依次遍历执行各个子目录中Makefile的clean目标进行清除 clean : $(foreach dir,$(SUBDIR),$(MAKE) -C $(dir) clean;) -rm $(OBJS) $(BIN) |
2.子目录中的Makefile
其实子目录lib中与子目录main中的Makfile内容完全相同,因为它们都只是编译本文件夹中的源文件然后输出o文件到obj目录中,它们的执行思想是一致的。
内容如下:
SRCS = $(wildcard *.c) #所有的c源文件 #这样写后obj文件就会依赖于对应的源文件,如果obj文件没有对应的源文件新,那么#obj文件会重新产生 OBJS = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS))) #这样写后depend文件就会依赖于对应的源文件,如果当前depend文件没有对应的文件 #新,那么depend文件会重新产生 DEPS = $(addprefix $(DEPENDDIR)/,$(patsubst %.c,%.d,$(SRCS))) .PHONY : all clean all : $(OBJS) #这里$(OBJDIR)/%.o 就等于$(OBJS),也就是目标all所依赖的文件,而当前obj目 #标又依赖于其对应的c文件通过对应的c文件就可以生成o文件 $(OBJDIR)/%.o : %.c $(CC) $< $(CFLAGS) $(INCLUDE) -o $@ #这里的$(DEPENDDIR)/%.d 就等于$(DEPS),当前dep文件依赖于其对应的c文件 $(DEPENDDIR)/%.d : %.c $(CC) $(CFLAGS) $(INCLUDE) -MM $< | sed -e 1's,^,$(OBJDIR)/,' > $@ #一定要加上这一句 #将生成的依赖关系文件引入到当前Makefile #否则会出现依赖关系的文件更新后目标文件也不会更新 sinclude $(DEPS) #有了这一句后$(DEPENDDIR)/%.d 目标就会执行 clean : -rm $(OBJS) $(DEPS)
|