我正在尝试为我的 C 项目实现一个 makefile,其目录结构如下:
PROJECT_FOLDER:
folder1
folder2
folder // n number of folders
main.c
FOLDER1:
subfolder1
subfolder // n number of subfolders
子文件夹 1 可以有更多的子文件夹等等。
我不想对我的目录结构感到愚蠢,我可能最深入的是 1-2 MAYBE 3。
到目前为止我有:
# A Makefile to build our First_Game_2 project
dirs = * */parse
PROJECT = main
HEADERS = $(PROJECT).h
OBJ = $(foreach dirz, $(dirs), \
\
$(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
\
)
C99 = gcc -std=c99
CFLAGS = -Wall -pedantic -Werror
$(PROJECT) : $(OBJ)
$(C99) $(CFLAGS) -o $(PROJECT) $(OBJ)
%.o : %.c $(HEADERS)
$(C99) $(CFLAGS) -c $<
clean:
rm -f $(PROJECT) $(OBJ)
我的问题是如果parse
包含子文件夹,比如说test
给出结构
PROJECT_FOLDER/parse/test
在这种情况下,不会返回任何内容
$(foreach dirz, $(dirs), \
\
$(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
\
)
我使用以下 makefile 测试了该函数的输出
# A Makefile to build our First_Game_2 project
dirs = * */parse
PROJECT = main
HEADERS = $(PROJECT).h
OBJ =
C99 = gcc -std=c99
CFLAGS = -Wall -pedantic -Werror
$(foreach dirz, $(dirs), \
\
$(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
\
)
其中,给定结构:
dirs = * */parse */parse/test
产生以下输出:
main.o parse/parse.o
忽略*/parse/test
为什么会出现这种情况,我该怎么做才能修复我的 OBJ 分配以识别*/parse/test
或以其他方式?
答案1
您在模式中使用了向后的通配符dirs
。你自找的:
dirs = * parse/* parse/test/*
正如所写,上面的模式扩展为:(*.c
好)、*/parse.c
(幸运!)和*/parse/test.c
,如果该文件存在,这会让您更加困惑。它看起来适用于第一级目录的唯一原因是因为您使用了相同的文件名“parse”作为目录名。