c-Makefile在第一次.o源代码外生成后停止生成文件



我有一个很大的Makefile,基本上可以随心所欲地工作

问题:我遇到的问题是,makefile只检查第一个.o是否需要更新,而不检查其他是否需要更新。我不确定我的makefile的哪个部分出错了。

上下文:我有这样的项目结构:

quendor
src
main.c
options.c
quendor.h
Makefile

当我的Makefile构建时,它构建了一个build目录,如下所示:

quendor
build
src
main.d
main.o
options.d
options.o
src
main.c
options.c
quendor.h
Makefile

查看问题:现在假设我不更改main.c,但更改了options.c文件。在这种情况下,当我再次运行make时,我得到的是:

make: 'build/./src/main.o' is up to date.

我不确定这是否是因为它正在构建到build/src目录中,而不仅仅是我想要的build

这是完整的Makefile,我把它包括在内,只是因为我不确定什么可能是问题,我不想做出不必要的假设。

.PHONY : all clean
NAME := quendor
PLATFORM := windows
CC := gcc
LINK := gcc
BUILD_DIR ?= ./build
SRC_DIR ?= ./src
ifeq ($(PLATFORM), windows)
TARGET ?= quendor.exe
else
TARGET ?= quendor
endif
ifeq ($(CC), gcc)
CFLAGS += -std=c11 -Wall -Wextra -Wpedantic -Wconversion -Wmissing-prototypes -Wshadow -MMD -MP
LDFLAGS +=
OPT +=
endif
SRCS := $(wildcard $(SRC_DIR)/*.c)
OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:%.o=%.d)
MKDIR_P ?= @mkdir -p $(dir $@)
-include $(DEPS)
all : $(TARGET)
@echo "Building $(TARGET)"
$(TARGET) : $(OBJS)
$(LINK) $(OPT) -o $@ $^ $(LDFLAGS)
$(BUILD_DIR)/%.o : %.c
$(MKDIR_P)
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(TARGET) -r $(BUILD_DIR)

这可能是StackOverflow如何解析我的Makfile的一个工件,但我确实注意到它在这一行之后显示了不同的语法突出显示:

SRCS := $(wildcard $(SRC_DIR)/*.c)

问题是,在定义all规则之前,您要包含依赖项:

-include $(DEPS)
all : $(TARGET)

如果您没有在命令行上指定要构建的特定目标(例如,如果您没有运行make all(,那么make会选择makefile中的第一个显式目标(以及任何包含的makefile!!(作为要构建的目标。

我假设$(DEPS)变量中的依赖项定义将main.o定义为目标,因为它位于all之前,所以它是默认情况下唯一运行的东西。

稍后在makefile中移动-include语句(我通常将这些语句都放在makefile的末尾(,它就会起作用。

相关内容

最新更新