MakeFile的写法

make命令会查找目录下的Makefile或者makefile文件,而后执行该文件。能够用 make -f 来指定自定义名称的Makefile文件ubuntu

编写Makefile文件要服从三个原则:ui

1)若是这个工程没有编译过,那么咱们的全部c文件都要编译并被连接。spa

2)若是这个工程的某几个c文件被修改,那么咱们只编译被修改的c文件,并连接目标程序。code

3)若是这个工程的头文件被改变了,那么咱们须要编译引用了这几个头文件的c文件,并连接目标程序。blog

Makefile的规则以下,这是Makefile的核心所在:get

Target ... :  prerequisites ...
              command ....
  • Target: 目标文件或者是一个label
  • prerequisites: Target的依赖文件
  • command: 执行的命令,在Makefile中的命令,必需要以[Tab]键开始。

这个语句的意思就是,当Target依赖的任何一个文件比Target新,或者是target不存在时,就执行command命令来生成Target文件。it

如今假设有3个头文件,和8个.c文件,一个Makefile的例子以下:编译

edit : main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o       /*注释:若是后面这些.o文件比edit可执行文件新,那么才会去执行下面这句命令*/
    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 :
    rm edit main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o

写完依赖文件后,在命令那行加上一个[tab],'\'表明一行没有写完。clean的后面没有定义依赖文件,使用make clean时,不会查找依赖文件,直接执行定义的命令。写好Makefile后在Makefile所在目录下执行make便可生成editor文件。最好为每一个makefile定义一个clean命令。class

.PHONY : clean
clean :
	-rm edit $(objects)

.PHONY为clean的伪目标,通常把clean放在文件最后,rm前的[-]表明忽略出现问题的文件。变量

一个Makefile中可能存在4种内容:

  1. 显式规则
  2. 隐式规则:make提供自动推导的功能,遇到.o时会自动推导出依赖文件包括.c,以及执行的命令cc -c,所以这些东西能够省略不写
  3. 变量
  4. 文件指示:可使用include包含其余Makefile文件,文件内容会放在包含文件处,include前不要有[Tab],在[-include]表示忽略找不到或者没法读取的文件,能够用空格隔开文件来包含多个文件;通常如今当前目录及
  5. 注释:单行注释,使用‘#’;

GNU中执行一个make命令的过程以下:

  1. 读入全部的makefile文件
  2. 读入被include的其余文件
  3. 初始化变量
  4. 推导隐晦规则,并分析全部规则
  5. 根据依赖文件为每一个目标文件创建依赖链
  6. 根据依赖链决定哪些文件须要从新编译
  7. 执行生成命令。

参考资料:http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile

相关文章
相关标签/搜索