【发布时间】:2021-01-12 08:50:25
【问题描述】:
GNU Make 新手并尝试构建一个 Makefile,该 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 文件的生成并正确输出二进制文件,但仅在不使用依赖项生成时按预期更改源文件时更新。我想知道是什么导致了这种行为,以及我的目标存在的问题。示例.depend 文件如下所示
obj/message.o: src/message.c src/message.h
obj/hello.o: src/hello.c src/message.h
【问题讨论】:
-
只需将
$(BINARY_DIR)/$(BIN_NAME):规则 放在include .depend行上,这样它将成为默认规则。