Makefile文件(一)_介绍

 参考原文http://blog.csdn.net/liang13664759/article/details/1771246/shell

Makefile介绍:ui

Makefile告诉make命令如何编译和连接文件,规则:spa

一、若是这个工程没有编译过,那么全部c文件都要编译并连接.net

二、若是某几个c文件被修改,那么只编译被修改的c文件,并连接目标程序code

三、若是头文件被改变,那么须要编译引用了这几个头文件的c文件并链接目标程序。blog

1、Makefile规则:

target... : prerequisites...

    command

...

...

 

说明:target 为目标文件,能够是obj,也能够是可执行文件,还能够是标签(就是一个标识而已)get

  prerequisites为,target所须要的文件,也就是target依赖的文件it

  command,make须要执行的命令(可任意shell命令以【Tab】键开始,多条命令能够多行,也能够“;”隔开置于一行)编译

  target的目标文件依赖于prerequisites中的文件,生成规则定义在command中。prerequisites中若是有一个以上的文件比target文件要新的话,command所定义的命令就会被执行,这是Makefile的规则,也是Makefile的核心class

2、Makefile例子 

例如:一个工程3个头文件,8个c文件。

原始Makefile

edit:main.o kbd.o command.o display.o/

insert.o search.o files.o utils.o

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

  insert.o search.o files.o utils.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

display.o : display.c defs.h buffer.h

  cc -c display.c

insert.o: insert.c defs.h buffer.h

  cc -c insert.c

search.o:search.c defs.h buffer.h

  cc -c search.c

files.o: files.c defs.h buffer.h command.h

  cc -c files.c

utils.o: utils.c defs.h

  cc -c utils.c

clean://只是一个标签,其后没有依赖,make命令并不会执行其后定义的命令

  rm edit main.o kbd.o command.o display.o/      //仅当make clean显示指出标签名字,才执行其后面的命令

  insert.o search.o files.o utils.o

3、make工做

默认方式下,只输入make命令,那么:

一、make会在当前目录下找到名字叫作“Makefile”或“makefile”的文件。

二、若是找到,会找文件中的第一个目标文件(target),在上面例子中,他会找到“edit”文件,并将其做为最终的目标文件

三、若是edit不存在,或是edit所依赖文件的修改时间要比edit文件新,那么就会执行后面所定义的命令来生成edit文件

四、若是edit所依赖的.o文件不存在,那么make会在当前文件中找到目标为.o文件的依赖性,若是找到再根据那个规则生成.o文件

五、固然,c文件和h文件是存在的,因而make会生成.o文件,而后再用.o文件生成edit文件。

说明:make会一层一层地去找文件的依赖关系,直到编译出第一个目标文件,在寻找过程当中,若是出现错误,好比最后被依赖的问文件找不到,那么make就会直接退出并报错;而对于所定义的命令的错误或是编译不成功,make根本不理会

因此,clean这种没有被第一个目标文件直接或间接关联,后面所定义的命令不会被自动执行。可是能够显示要make的执行,“make clean”

编译中,若是其中一个源文件被修改,file.c,那么file.o会被从新编译,因此file.o是新的文件,比edit要新,因此edit也会被从新链接。若是改变了“command.h”,那么kbd.o、command.o和files.o都会被编译,而且,edit会被从新链接。

 

4、Makefile中使用变量

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

    insert.o search.o files.o utils.o

edit:$(objects)

  cc -o edit $(objects)

main.o:main.c defs.h

  cc -c main.c

......

clean:

  rm edit $(objects)

 

5、让make自动推导

只要make看到一个.o文件,他会自动把.c文件加到依赖关系中,若是make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。而且cc -c whatever.c也会被推导出来,因而

make的 "隐晦规则"

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

      insert.o search.o files.o utils.o

edit : $(objects)

  cc -o edit $(objects)

main.o:defs.h

kbd.o:defs.h command.h

command.o: defs.h command.h

display.o : defs.h buffer.h

insert.o: defs.h buffer.h

search.o: defs.h buffer.h

files.o: defs.h buffer.h command.h

utils.o: defs.h

.PHONY:clean  //.PHONY表示clean是个伪目标文件

clean:

  rm edit $(objects)

6、另类风格的Makefile:

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

      insert.o search.o files.o utils.o

edit: $(objects)

  cc -o edit $(objects)

$(objects): defs.h

kbd.o command.o files.o: command.h

display.o insert.o search.o files.o: buffer.h

.PHONY:clean

clean:

r  m edit $(objects)

7、清空目标文件规则

makeMakefile都用该写一个清空目标文件(.o和执行文件)的规则,不只便于从新编译,也利于保持文件的清洁。

通常:

clean:
  rm edit $(objects)

更为稳健的作法:

.PHONY: clean

clean:

  -rm edit $(objects)//rm前面的-,表示就算某些文件出现问题也继续作后面的事情。

说明:clean的规则不要放在文件的开头,否则就会成为make的默认目标。通常,clean都是放在文件的最后。

相关文章
相关标签/搜索