C语言 Makefile没有递归生成子目录

ivqmmu1c  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(171)

我有下面的目录结构。我试图把所有的文件编译成目标文件。

├── Makefile
├── prime_probe.c
└── utils
    ├── Makefile
    ├── caches_info.c
    ├── caches_info.h
    ├── caches_util.c
    ├── caches_util.h
    ├── configure.h
    ├── list_struct.h
    ├── list_utils.c
    └── list_utils.h

生成文件

THIS_DIR  := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
OBJDIR = obj

CFLAGS = -I./$(OBJDIR) -g -fPIC -std=gnu99

UTILS_DIR := utils
OBJS_UTL   = $(addprefix $(UTILS_DIR)/$(OBJDIR)/,$(notdir $(patsubst %.c,%.o,$(shell find $(UTILS_DIR)/*.c))))
SRCS_PRIME =                  \
    prime_probe.c       

OBJS_PRIME = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS_PRIME)))
all: clean utils $(OBJS_PRIME) 
$(OBJDIR)/%.o: %.c | objdir
    $(CC) $(CFLAGS) -c $< -o $(OBJDIR)/$(notdir $@)

utils:
    $(MAKE) -C $(UTILS_DIR) 

objdir:
    @mkdir -p $(OBJDIR)

clean:
    rm -rf $(OBJDIR)
    $(MAKE) clean -C $(UTILS_DIR)/

Makefile子目录为

THIS_DIR  := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
##################
# Build directory
##################
OBJDIR = obj

CFLAGS = -I./$(OBJDIR) -g -fPIC -std=gnu99 -static
####################
# Files and folders
####################

SRCS_PRIME = $(shell find ./*.c)

OBJS_PRIME = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS_PRIME)))

##########
# Targets
##########

all:  $(OBJS_PRIME)
$(OBJDIR)/%.o: %.c | objdir
    $(CC) $(CFLAGS) -c $< -g -o $@

objdir:
    @mkdir -p $(OBJDIR)

clean:
    rm -rf $(OBJDIR)

当我执行make命令时,子目录中的文件没有被编译。我单独执行make utils,这表明子目录是最新的。但是当我进入子目录并执行make时,我可以看到文件将被编译。
为什么会这样?谢谢!!!

root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel# make
rm -rf obj
make clean -C utils/
make[1]: Entering directory '/usr/local/src/gem5/programs/covert_channel/utils'
rm -rf obj
make[1]: Leaving directory '/usr/local/src/gem5/programs/covert_channel/utils'
cc -I./obj -g -fPIC -std=gnu99 -c prime_probe.c -o obj/prime_probe.o

root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel# make utils
make: 'utils' is up to date.

root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel# cd utils/
root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel/utils# make
cc -I./obj -g -fPIC -std=gnu99 -static -c caches_info.c -g -o obj/./caches_info.o
cc -I./obj -g -fPIC -std=gnu99 -static -c caches_util.c -g -o obj/./caches_util.o
cc -I./obj -g -fPIC -std=gnu99 -static -c list_utils.c -g -o obj/./list_utils.o
toiithl6

toiithl61#

如果您希望构建实用程序作为非文件目标,则需要使用以下命令将其指定为非文件目标:

.PHONY: utils

我建议不要使用递归make,除了不能为make提供全局状态之外,它还使它变得不必要地复杂(恕我直言)。

相关问题