c - 将目录依赖项指定为百分比规则时,Linux 上的 Make 行为非常奇怪

标签 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 的工作。我发现骑自行车的行为很烦人。

为什么会这样?

最佳答案

这是因为您的 Make 规则希望目录比 .o 文件

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

所以:

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

看到 %.o 是陈旧的,然后使用react。

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

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

关于c - 将目录依赖项指定为百分比规则时,Linux 上的 Make 行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731076/

相关文章:

c - 从 Linux C 调用网页

c - 什么函数实际调用 WinMain

Java执行命令但不返回值

php - UTF-8贯穿始终

c - 新手 : what is wrong with my makefile?

c - 维基百科的读写锁实现是否正确?

c - fifo linux - write() 函数突然终止程序

linux - Linux 上/dev 目录上的 USB 设备检测

makefile - 仅当先决条件发生变化时,如何让 GNU make 重建虚假目标?

c - makefile 不分别更新 .o 文件和 .h 文件