我的文件夹结构如下:
.
├── 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.h
。app
和都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
在第二条规则中。