简单理解Makefile

来源:互联网 发布:剑网三咩萝捏脸数据 编辑:程序博客网 时间:2024/06/03 21:47

1. 从hello world开始,假设在hello.c中有如下代码:

#include <stdio.h>int main(int argc, char* argv[]){    printf("hello world.\n");    return 0;}
把hello.c编译成可执行程序hello,可简单分成下面两步:
gcc -c hello.c        #把.c生成.o, -c表示只编译不链接gcc -o hello hello.o  #把.o文件生成可执行程序。-o表示生成可执行程序,后面跟自定义的可执行程序的名字

上述过程在makefile中包含两层依赖关系和两条命令:

hello : hello.o  #hello由hello.o生成,所以hello依赖于hello.o,                  #依赖关系用分号隔开,左边的叫做目标(target),右边称为依赖(prerequisites)hello.o : hello.c
当依赖文件被修改时,则执行命令(command),命令跟在依赖关系的下面一行:

hello : hello.ogcc -o hello hello.ohello.o : hello.cgcc -c hello.c      #片段1

执行make或make hello命令,就可以得到可行性程序hello了。

综上所述,makefile就是一个简单公式:

target ... : prerequisites ...         command

2.makefile中的隐式规则,.o文件对.c文件的规则会自动执行,所以片段1可以写成:

hello : hello.o    gcc -o hello hello.o   #片段2

3. makefile中的3个符号$@,$^,$<。

    $@表示目标,$^表示所有的依赖文件,$<表示第一个依赖文件,则片段2可以表示成:

hello : hello.o          #  片段3gcc -o $@ $^      #  $@即hello,$^即hello.o,此处只有一个依赖文件,也可以用$<替代$^,                         #  即gcc -o $@ $<,多个依赖文件时只能用$^

4.makefile中变量的使用,比如hello.c同时用到了a.c,b.c或多个源文件,则片段3可写成:
objs = hello.o a.o b.ohello : $(objs)            # objs即自定义的变量名,引用时$加小括号扩起来$(objs)    gcc -o $@ $^           # 片段4
5.再定义两个变量,片段4可改写成:
CC     = gccTARGET = helloobjs   = hello.o a.o b.o$(TARGET) : $(objs)    $(CC) -o $@ $^
6.makefile中换行用Tab键!