Makefile 依赖问题-2

继上次说的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的工作目录:

下次再说文件自动依赖。。。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值