继上次说的Makefile依赖问题-1:Makefile依赖问题-1-CSDN博客
我们说编写Makefile的时候注意目标(target,目标在文件系统中是否会生成文件以及生成文件所在的位置)、依赖文件(prerequisites,确定依赖文件是否完整,以及确定这些个文件是否真的能决定目标的更新),以及这两者之间的关系。
回顾:
1. 代码组织
2. Makefile内容
#demo 1
vpath %.h include
vpath %.c src
OBJS := func.o main.o
HEADERDIR = -Iinclude
OBJDIR = obj
BINDIR = bin
$(BINDIR)/hello.out : $(addprefix $(OBJDIR)/, $(OBJS))
gcc -o $@ $^
@echo "Target File => $(BINDIR)/$@"
$(OBJDIR)/%.o : %.c
gcc $(HEADERDIR) -o $@ -c $<
.PHONY: clean
clean:
-rm -rf $(OBJDIR)/*.o $(BINDIR)/hello.out
斯到普,斯到普,先在这里考虑一下一个这样的问题:我用如下的方式写有什么问题?如果有问题的话会是什么样的问题?
#demo 2
vpath %.h include
vpath %.c src
OBJS := func.o main.o
HEADERDIR = -Iinclude
OBJDIR = obj
BINDIR = bin
$(BINDIR)/hello.out : $(OBJS)
gcc -o $@ $(addprefix $(OBJDIR)/, $(OBJS))
@echo "Target File => $(BINDIR)/$@"
$(OBJDIR)/%.o :%.c
gcc $(HEADERDIR) -o $@ -c $<
.PHONY: clean
clean:
-rm -rf $(OBJDIR)/*.o $(BINDIR)/hello.out
好啦好啦,出现的问题:我觉得这个问题写过C的应该都见过。。。
出现问题的原因:
onsidering target file 'bin/hello.out'.
Considering target file 'func.o'.
File 'func.o' does not exist.
Looking for an implicit rule for 'func.o'.
...
...
...
Finished prerequisites of target file 'func.c'.
No need to remake target 'func.c'; using VPATH name 'src/func.c'.
Finished prerequisites of target file 'func.o'.
Must remake target 'func.o'.
cc -c -o func.o src/func.c
正常情况下:
File 'bin/hello.out' does not exist.
Considering target file 'obj/func.o'.
File 'obj/func.o' does not exist.
Looking for an implicit rule for 'obj/func.o'.
Trying pattern rule with stem 'func'.
Trying implicit prerequisite 'func.c'.
Found prerequisite 'func.c' as VPATH 'src/func.c'
Found an implicit rule for 'obj/func.o'.
...
...
...
Finished prerequisites of target file 'func.c'.
No need to remake target 'func.c'; using VPATH name 'src/func.c'.
Finished prerequisites of target file 'obj/func.o'.
Must remake target 'obj/func.o'.
gcc -Iinclude -o obj/func.o -c src/func.c
出问题是因为找不到目标func.o,如果在Makefile中没有这个目标的话,会发生什么? 使用隐式规则:cc -c o func.o src/func.c,然而我们的头文件是在include中的,所以肯定会报错的。。。
这里多说一嘴儿:不管是VPATH变量还是vpath关键字,能决定的是关于Makefile的依赖关系,因为Makefile它就只管依赖关系,make only and only does this thing。因此不是说你在vpath指定了头文件的路径,gcc就会去那个路径下找,不可能的,gcc属于recipe部分,是命令,但是make命令会因为依赖关系去相应的目录下找target: prerequisites对应的文件的。规则是规则,命令是命令。
用demo 2的Makefile,func.h移动到src目录下,编译出现的问题:这个就不解释了。
到这里一个例子变来变去,可能有意思,可能也没有意思:
1、.c文件中include "头文件", 头文件的路径是针对.c来说的。
2、像-I选项的路径设置,跟make命令有关,跟Makefile文件的位置没有关系。
下边这几个图注意看make命令所在的工作目录(怎么去执行make命令的)
这里用的demo 1那个Makefile。
有问题:
demo1改一点,其它不动:
...
vpath %.c example3/src
...
还有问题,但是应该知道怎么做了吧。。
使用demo 1原版,没问题,不过执行make时要跟上边不一样了,改了make的工作目录:
下次再说文件自动依赖。。。