这是预期的行为吗?

这是预期的行为吗?

我的文件夹结构如下:

.
├── app.c
├── inc
│   ├── butil.h
│   └── libs
│       ├── flagutil.h
│       ├── libflagutil.c
│       └── libflagutil.o
└── Makefile

我的Makefile样子是这样的:

CC = gcc
WARN = -Wall -Wconversion -Wextra -Wno-unused-variable -Wno-unused-parameter
DEBUG = -ggdb -O0

app: ./app.c ./inc/libs/flagutil.h ./inc/butil.h ./inc/libs/libflagutil.o
    $(CC) $(WARN) app.c ./inc/libs/libflagutil.o -o ./app

libflagutil.o: ./inc/libs/libflagutil.c ./inc/libs/flagutil.h 
    $(CC) $(WARN) ./inc/libs/libflagutil.c -c -o ./inc/libs/libflagutil.o

app-debug: ./app.c ./inc/libs/flagutil.h ./inc/butil.h ./inc/libs/libflagutil.o
    $(CC) $(WARN) $(DEBUG) app.c ./inc/libs/libflagutil.o -o ./app

我对其行为有点困惑。假设我对文件进行了重大更改./inc/libs/flagutil.happ和都libflagutil.o依赖于它。

然后,我只需运行make。由于主规则app依赖于./inc/libs/flagutil.h,并且它已被更改,因此规则下方的行将被执行。

但是libflagutil.o, 是 的依赖项app(主要规则),也依赖于./inc/libs/flagutil.h,并且它的变化可能会对 产生重大影响libflagutil.o,而 又是 的依赖项app

但是,简单地运行make并没有执行libflagutil.o规则,这意味着libflagutil.c没有重新编译,并且app可执行文件与旧版本的链接libflagutil.o

当然,可以通过在make libflagutil.o对进行更改后明确运行来解决此/inc/libs/flagutil.h问题,然后才运行主规则,但这不就是为了make避免这样的麻烦吗?

我是否遗漏了什么或者这种行为是预期的?

答案1

您需要指定规则目标中文件的完整路径,否则 make 会认为它们位于当前目录中。

在你的情况下,使用

./inc/libs/libflagutil.o: ./inc/libs/libflagutil.c ./inc/libs/flagutil.h 

在第二条规则中。

相关内容