簡體   English   中英

Makefile每次都重建一切,為什么?

[英]Makefile rebuilds everything every time, why?

我這里有簡單的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)
  1. 獲取所有c文件名稱。
  2. 從它們制作簡單的名稱(沒有擴展名)和對象名稱。
  3. 做着東西

重要的是 - 一切正常,但每次我打印make(編譯和鏈接所有文件)都有效。 即使我沒有改變任何東西,而且我連續幾次這樣做,依賴關系出了什么問題?

我期待像“blabla是最新的”之類的東西。

$(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)

你騙了。 您承諾每個$(NAMES)目標在當前目錄中創建其目標文件,但由於$(CC) -o bin/$@ obj/$^它在bin目錄中創建。

在下一次make調用時,它無法找到目標文件並再次運行每個命令。

Makefile的硬性和快速規則:每個非PHONY目標必須在其命令中使用普通的$@來指示它創建的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM