Makefile学习笔记(1)

简单的初始示例:

edit : main.o kbd.o command.o

        cc -o edit main.o kbd.o command.o

main.o : main.c defs.h

        cc -c main.c

kbd.o : kbd.c defs.h command.h

        cc -c kbd.c

command.o : command.c defs.h command.h

        cc -c command.c

clean :

        rm edit main.o kbd.o command.o

运行流程:

  •   make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  •   如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
  •   如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
  •   如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
  •   当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件声明make的终极任务,也就是执行文件edit了

为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。

我们声明一个变量,叫objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管什么啦,只要能够表示obj文件就行了。我们在makefile一开始就这样定义:

    objects = main.o kbd.o command.o display.o 

我们就可以很方便地在我们的makefile中以$(objects)的方式来使用这个变量了,于是我们的改良版makefile就变成下面这个样子:

   objects = main.o kbd.o command.o display.o \
             insert.osearch.o files.o utils.o 
   edit : $(objects)
           cc -o edit $(objects)

它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。 只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。

   objects = main.o kbd.o command.o 
 
   edit : $(objects)
           cc -o edit $(objects)
 
   main.o : defs.h
   kbd.o : defs.h command.h
   command.o : defs.h command.h
 
   .PHONY : clean
   clean :
           rm edit $(objects)

即然我们的make可以自动推导命令,,能把[.o], [.h]其收拢起来,最新的:

   objects = main.o kbd.o command.o 
 
   edit : $(objects)
           cc -o edit $(objects)
 
   $(objects) : defs.h
   kbd.o command.o : command.h
 
   .PHONY : clean
   clean :
           rm edit $(objects)

清空目标文件:

一般的风格都是:

       clean:

           rm edit $(objects)

更为稳健的做法是:

       .PHONY : clean

       clean :

               -rm edit $(objects)

猜你喜欢

转载自blog.csdn.net/weixin_42792614/article/details/82220764