MakeFile的写法

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

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

1)如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。

2)如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。

3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。

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

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

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

现在假设有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命令。

.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

posted on 2017-08-15 11:17  wangdake_tec  阅读(293)  评论(0编辑  收藏  举报

导航