Makefile:如何写⽬标依赖
本⽂并不是Makefile的教程,仅是本⼈学习时的感悟。
Makefile的基本格式
⽬标:依赖⽂件(or ⽬标)
[tab]命令
⽬标: 是要⽣成的或操作的命令的索引
依赖: 是⽣成⽬标依赖的⽂件或⽬标
命令: 是为了⽣成⽬标需要执⾏的shell语句
任意⼀个依赖⽂件被改动,将导致已存在的⽬标⽂件过期,简单来说,依赖的作⽤就是决定⽬标是否过期,是否需要重新编译。举个例⼦,
#include <stdio.h>
#include "mylib1.h"
#include "mylib2.h"
int main(int argc, char argv[]){
printf("hello world!\n");
}
makefile phony对应的Makefile可以是
helloworld: stdio.h mylib1.h mylib2.h other.o
gcc -o helloworld helloworld.c
也可以是
helloworld: other.o
gcc -o helloworld helloworld.c
前者希望在stdio.h、mylib1.h、mylib2.h、other.o被修改时重新执⾏helloworld⽬标,⽽后者仅仅希望检查other.o的修改。⽬标依赖往往还有另外⼀种⽤法,⽤于执⾏其他⽬标。例如
.PHONY: all clean target
all: target clean
target: helloworld.o
gcc helloworld.o -o helloworld
helloworld.o:
gcc -c helloworld.c
clean:
rm helloworld.o
执⾏all⽬标的时候,依赖另外两个⽬标target和clean。在执⾏all⽬标前,会优先执⾏⽬标target和clean。
怎么判断all依赖的是⽬标还是⽂件?
.PHONY: all
all: test
@echo in all
test:
@echo in test
执⾏这个Makefile时,当前⽬录下有⽆test⽂件会有两个不同的执⾏结果
[GMPY@11:24 tmp]$ll
总⽤量 4.0K
1186807 -rw-r--r-- 1 gmpy gmpy 57 4⽉  5 11:20 Makefile
[GMPY@11:24 tmp]$make
echo in test
in test
echo in all
in all
[GMPY@11:24 tmp]$touch test #创建test⽂件
[GMPY@11:24 tmp]$make
echo in all
in all
[GMPY@11:24 tmp]$
总结来说,判断依赖是⽬标还是⽂件,有以下两个规则:
1. 优先检查当前⽬录下是否有同名⽂件,有则⽂件,⽆则⽬标
2. .PHONY 标识的都是(伪)⽬标,不再检查⽂件是否存在

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。