繁体   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