我在这里有简单的makefile:
SOURCES= $(wildcard *.c)
OBJECTS= $(patsubst %.c, %.o, $(SOURCES))
NAMES= $(patsubst %.c, %, $(SOURCES))
CC=gcc
CFLAGS= -Wall -c -o
TASKS_IN_DIRS= $(addprefix obj/,$(OBJECTS)) $(addprefix bin/,$(NAMES))
all: $(NAMES)
$(NAMES): %: %.o $(OBJECTS)
$(CC) -o bin/$@ obj/$^
$(OBJECTS): %.o: %.c
$(CC) $(CFLAGS) obj/$@ $<
clean:
rm -rf $(TASKS_IN_DIRS)
重要的是 - 一切正常,但每次我打印make(编译和链接所有文件)都有效。即使我没有改变任何东西,而且我连续几次这样做,依赖关系出了什么问题?
我期待的是“blabla是最新的”。
答案 0 :(得分:5)
$(OBJECTS): %.o: %.c
$(CC) $(CFLAGS) obj/$@ $<
正在查看当前目录中的.o文件。因为他们不在那里,所以正在重建它们。
以下是您想要的。
SOURCES= $(wildcard *.c)
OBJECTS:= $(patsubst %.c, %.o, $(SOURCES))
OBJECTS:= $(addprefix obj/,$(OBJECTS))
NAMES:= $(patsubst %.c, %, $(SOURCES))
NAMES:= $(addprefix bin/,$(NAMES))
CC=gcc
CFLAGS= -Wall -c -o
TASKS_IN_DIRS=$(OBJECTS) $(NAMES)
all: $(NAMES)
$(NAMES): $(OBJECTS)
$(CC) -o $@ $<
obj/%.o: %.c
$(CC) $(CFLAGS) $@ $<
clean:
rm -rf $(TASKS_IN_DIRS)
答案 1 :(得分:5)
你撒谎。你承诺每个$(NAMES)
目标都会在当前目录中创建其目标文件,但由于$(CC) -o bin/$@ obj/$^
它在bin
中创建{1}}目录。
在下一次make
调用时,它无法找到目标文件并再次运行每个命令。
Makefile的硬性和快速规则:每个非PHONY目标必须在其命令中的某处使用普通$@
来指示它创建的文件。