我观察到一个简单的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的工作。我发现骑车行为很烦人。
为什么会这样?
答案 0 :(得分:1)
这是因为您的制作规则要求目录<。>较早而不是.o文件。
但是当您编译对象并将其放入目录时,目录会更新,并且变得比.o文件更新。
所以:
$(OBJDIR)/%.o: %.c $(OBJDIR)
看到%.o,陈旧,然后做出反应。
我记得有一个优雅的解决方法,但应该快速修复
$(OBJDIR)/%.o: %.c $(OBJDIR)
gcc -c $< -o $@
touch $@