簡體   English   中英

使用 gcc 自動生成依賴項

[英]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.

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