首页 > 解决方案 > MakeFile 的子目录和 GCC 问题

问题描述

我正在makefile为一个用 C 编写的非常小的个人项目编写一个。
我的项目分为子目录,但是即使(我认为)代码是正确的,也找不到这些 utilme 的指令:

TARGET = example.out

ENV = /usr/bin/env
MKDIR = mkdir
RMV = rm
CP = cp

CC = gcc
CFLAGS = -lm

BINDIR = ./bin
OBJDIR = ./obj
SRCDIR = ./src

SRCS = master.o request/request.o util/util.o # these are all .c files (./src/...)

# ---
.PHONY: build
build: prepare $(SRCS)
    $(ENV) $(CC) $(addprefix $(OBJDIR)/, $(SRCS)) -o $(BINDIR)/$(TARGET)

# ---
.PHONY: prepare
prepare:
    @$(ENV) $(MKDIR) -p $(BINDIR) $(OBJDIR)
    @$(ENV) $(CP) data.txt $(BINDIR)/data.txt

# ---
.PHONY: clean
clean:
    @$(ENV) $(RM) -rf $(BINDIR) $(OBJDIR)

# ---
$(OBJDIR)/%.o: $(SRCDIR)/%.c
    $(ENV) $(CC) $(CFLAGS) -c $<

它说:

make: *** No rule to make target 'master.o', needed by 'build'.  Stop.

如果我更改$(OBJDIR)/%.o: $(SRCDIR)/%.c%.o: $(SRCDIR)/%.c,它会说:

make: *** No rule to make target 'request/request.o', needed by 'build'.  Stop.

标签: cgccmakefile

解决方案


您实际上没有master.o.master.c

在以下规则中:

$(OBJDIR)/%.o: $(SRCDIR)/%.c

./obj/%.o不匹配master.o

如果master.csrc(如注释所示)默认规则也不匹配。

所以为了匹配规则,目标必须是./obj/master.o

所有其他 .o 文件也是如此,您将在子目录中遇到麻烦。为了解决这个问题,您可以直接在配方中创建目标目录:

$(OBJDIR)/%.o: $(SRCDIR)/%.c
        mkdir -p $(dir $@)
        $(CC) -c -o $@  $(CFLAGS) $<

推荐阅读