【问题标题】:Automatic make dependency generation with gcc使用 gcc 自动生成依赖项
【发布时间】: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 行上,这样它将成为默认规则。

标签: gcc makefile


【解决方案1】:

阅读 GNU make 手册中的the intro section,您将在第一句话中看到:

默认情况下,make 从第一个目标开始。

makefile 中的第一个目标是什么?由于include 位于任何其他目标之前,因此它是included 文件中的第一个目标。

正如 Beta 所说,只需将 include 行放在您的 makefile 的末尾(或者至少不要放在开头),您的问题就会得到解决。

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 2021-05-03
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多