1

1.1 Makefile的规则

    target... : prerequisites ...
          command
          ...
          ...

解释:
Target : 是一个目标文件,也可以是执行文件,还可以是一个标签(Label)。
Prerequisites :要生成那个target所需要的文件或是目标。
Command : make需要执行的命令。(任意的Shell命令)

1.2 一个示例

main : main.o run.o speak.o eat.o sleep.o
    gcc  -o main main.o run.o \
            speak.o eat.o sleep.o
main.o: main.c
    gcc  -c main.c
run.o : run.c run.h
    gcc  -c run.c run.h
sleep.o : sleep.h sleep.c
    gcc  -c sleep.h sleep.c
eat.o : eat.h eat.c
    gcc  -c eat.c eat.h
speak.o : speak.h speak.c
    gcc  -c speak.h speak.c
clean : 
    -rm main.o run.o \
        speak.o eat.o sleep.o main

反斜杠(\)是换行符的意思。这样比较便于Makefile的易读。
一、在定义依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。
二、make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。
三、clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

1.3 makefile中使用变量

对于.o文件多次被使用,在makefile中以“$(objects)”的方式来使用这些变量

OBJECTS= main.o run.o \
           speak.o eat.o sleep.o
main : $(OBJECTS)
    gcc $(CFLAGS) -o main $(OBJECTS)
main.o: main.c
    gcc $(CFLAGS) -c main.c
run.o : run.h run.c
    gcc $(CFLAGS) -c run.h run.c 
sleep.o : sleep.h sleep.c
    gcc $(CFLAGS) -c sleep.h sleep.c
eat.o : eat.h eat.c 
    gcc $(CFLAGS) -c  eat.h eat.c
speak.o : speak.h speak.c
    gcc $(CFLAGS) -c speak.h speak.c
clean : 
    -rm $(OBJECTS) main

1.4 让make自动推导

GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。

CFLAGS = -Wall
OBJECTS= main.o run.o \
         speak.o eat.o sleep.o
main : $(OBJECTS)
    gcc $(CFLAGS) -o main $(OBJECTS)
eat.o main.o : eat.h
run.o main.o : run.h
speak.o main.o : speak.h
sleep.o main.o : sleep.h
.Phony : clean
clean : 
    -rm $(OBJECTS) main

1.5 清空目标文件的规则

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

为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。


shiyang6017
158 声望59 粉丝

引用和评论

0 条评论