![](/img/trans.png)
[英]How is automatic dependency generation with GCC and GNU Make useful?
[英]Automatic make dependency generation with gcc
剛接觸 GNU Make 並嘗試構建一個 Makefile,它會自動生成用於重建的依賴項,以便在更改頭文件時重建和鏈接必要的對象。
而不是使用 .d 文件,我想要一個像.depend
這樣的單個文件,所以我有一個規則來創建文件並將其作為這樣的依賴項包含在內(使用 sed 在每一行前面附加obj/
)
.depend: $(SRC_FILES)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ | sed 's/^/$(OBJECT_DIR)\//' >> ./.depend;
include .depend
問題是,在構建時它只編譯.depend
文件中的第一條規則,然后連續停止。 這很可能是我設置規則/目標的方式有問題,但我無法弄清楚是什么讓它在第一個構建的對象處停止,我的文件看起來像這樣
BIN_NAME := test
# Compiler
CC := gcc
CFLAGS := -Wall -O3
# Directories
BINARY_DIR := bin
OBJECT_DIR := obj
SOURCE_DIR := src
# Files
SRC_FILES := $(wildcard $(SOURCE_DIR)/*.c)
OBJ_FILES := $(patsubst $(SOURCE_DIR)/%.c,$(OBJECT_DIR)/%.o, $(SRC_FILES))
# Dependencies
.depend: $(SRC_FILES)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ | sed 's/^/$(OBJECT_DIR)\//' >> ./.depend;
#include .depend
# Targets
$(OBJECT_DIR)/%.o: $(SOURCE_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(BINARY_DIR)/$(BIN_NAME): $(OBJ_FILES)
$(CC) $(CFLAGS) -o $@ $^
clean:
rm $(OBJECT_DIR)/* $(BINARY_DIR)/* .depend
注釋include .depend
跳過 .depend 文件的生成並正確輸出二進制文件,但僅在不使用依賴項 gen 時按預期更改源文件時才更新。 我想知道是什么導致了這種行為,以及我的目標存在的問題。 示例.depend
文件如下所示
obj/message.o: src/message.c src/message.h
obj/hello.o: src/hello.c src/message.h
閱讀 GNU make 手冊中的介紹部分,您將在第一句話中看到:
默認情況下,make 從第一個目標開始。
你的 makefile 中的第一個目標是什么? 由於include
出現在任何其他目標之前,因此它是include
d 文件中的第一個目標。
正如 Beta 所說,只需將include
行放在 makefile 的末尾(或者至少不是開頭),您的問題就會得到解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.