一个Makefile

来源:互联网 发布:手机注册界面html源码 编辑:程序博客网 时间:2024/05/17 08:13

一个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 :

#依次遍历执行各个子目录中Makefileall目标

$(foreach dir,$(SUBDIR),$(MAKE) -C $(dir) all;) 

#调用link进行链接

$(MAKE)  link

link : 

$(CC) $(OBJS) -o $(BIN)

#依次遍历执行各个子目录中Makefileclean目标进行清除

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)

 

 

原创粉丝点击