非常奇怪在将目录依赖性指定为百分比规则时在linux上执行行为

时间:2016-11-21 23:08:41

标签: c linux makefile

我观察到一个简单的makefile的以下非常奇怪的行为:

对于C项目,假设我在目录中编译了n> = 2 .c文件。

例如假设你有一个a.c和b.c来编译

我的makefile是:

OBJDIR = obj

all: $(OBJDIR)/a.o $(OBJDIR)/b.o
$(OBJDIR):
        mkdir $(OBJDIR)
$(OBJDIR)/%.o: %.c $(OBJDIR)
        gcc -c $< -o $@

因此需要编译a.o和b.o并将其放入新的文件夹obj中。 我想这样做是因为我发现在同一文件夹中包含.c和.o文件很麻烦。此外,我想创建该文件夹,如果它不存在,因为当我上传项目与git由于某种原因它不跟踪空文件夹。

在我的Windows机器上它工作正常并做我想要的。

make
mkdir obj
gcc -c a.c -o obj/a.o
gcc -c b.c -o obj/b.o
make
make: Nothing to be done for 'all'.

然而,在我的linux机器上,它执行以下操作:

make
mkdir obj
gcc -c a.c -o obj/a.o
gcc -c b.c -o obj/b.o
make
gcc -c a.c -o obj/a.o
make
gcc -c b.c -o obj/b.o
make
gcc -c a.c -o obj/a.o
make
gcc -c b.c -o obj/b.o

我只在这里运行make命令。其他行是make的工作。我发现骑车行为很烦人。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

这是因为您的制作规则要求目录<。>较早而不是.o文件。

但是当您编译对象并将其放入目录时,目录会更新,并且变得比.o文件更新。

所以:

$(OBJDIR)/%.o: %.c $(OBJDIR)

看到%.o,陈旧,然后做出反应。

我记得有一个优雅的解决方法,但应该快速修复

$(OBJDIR)/%.o: %.c $(OBJDIR)
gcc -c $< -o $@
touch $@