编写过一段Makefile文件后会发现,目标文件、依赖文件、编译命令之间存在一定的规律。比如目标文件一般依赖同名的.c文件,而生成这种目标文件使用gcc编译。为了简化Makefile文件的编写,make命令在实现时内嵌了隐含规则。

1、make命令在实现时内嵌了隐含规则,自动建立关于这个目标文件的依赖文件和编译所使用的命令。
隐含规则的基础是目标文件的拓展名! 比如:

program : header1.h header2.h

make会认为program是一个可执行文件,并根据隐含规则建立如下规则:

program : header1.h header2.h
    gcc -o program program.c

2、与C语言有关的拓展名

  • .c:C语言源文件
  • .h:头文件
  • .o:目标文件(gcc中间文件,而不是makefile的目标文件)

涉及C语言的两条规则:
(1)对于没有后缀的目标文件,Makefile没有指定依赖文件和编译命令,并且当前目录下可以找到同名的.c源文件,make为该目标建立上例中的规则;
(2)对于以.o结尾的目标文件,Makefile没有指定依赖文件和编译命令,并且当前目录下可以找到同名的.c源文件,make建立一个规则生成.o文件;

program.o : header1.h header2.h

转为

program.o : header1.h header2.h
    gcc -c program -o program.o

上面的第一条规则,make中表示为:

$(CC) $(CFLAGS) $@ $<

CC默认为gcc,CFLAGS默认为-o$@是目标文件,$<第一个依赖文件;

第二条规则:

$(CC) -c $< $@

可以通过改变预定义变量来改变隐含规则:

CC=gcc
program.o:header1.h header2.h

标签: none

评论已关闭