我有下面的目录结构。我试图把所有的文件编译成目标文件。
├── 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
1条答案
按热度按时间toiithl61#
如果您希望构建实用程序作为非文件目标,则需要使用以下命令将其指定为非文件目标:
我建议不要使用递归make,除了不能为make提供全局状态之外,它还使它变得不必要地复杂(恕我直言)。