我正在编写一个模式来编译.c
目录中的所有test
文件。
目录详情如下:
./prj/makefile
./prj/test
./prj/test/test1/a.c
./prj/test/test1/b.c
./prj/test/test2/c.c
./prj/test/test2/d.c
./prj/test/e.c
...
只是一个演示。这是我makefile
的内容:
# Find all files
rwildcard := $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
# All .c files
SRC_FILES := $(call rwildcard,test,*.c)
# All .o files
OBJ_FILES := $(SRC_FILES:.o=.c)
all : $(OBJ_FILES)
echo $(OBJ_FILES)
%.o : %.c
echo $@ $<
制作照片No rule to make target '...'
。我认为需要知道.o
个文件和.c
文件的路径。但是我不知道如何设置路径,因为我的prj中有很多.c
个文件。
因为OBJ_FILES
包含所有.o
个文件。然后我猜模式应该是这样的:
$(output_dir)/%.o : $(input_dir)/%.c echo $@ $
因为./prj/test中可能有很多目录,所以我不能在makefile中硬编码
感谢另一位朋友,上述方法是正确的。因为%可以匹配许多多级目录。
答案 0 :(得分:0)
您可以使用它来获取子目录中的所有c文件:
$(wildcard */*.c)
或者这也是为了获得任何深度的子目录中的所有c文件:
$(wildcard **/*.c)
答案 1 :(得分:0)
我们无法真正解决您的问题,因为您仍未指定目标文件的位置。所有在特定目录?始终在源文件的父目录中?在其他地方?
无论您如何解决这个问题,您都可以将所有源目录添加到VPATH
,并在确定依赖关系时解决精确位置。
VPATH=test:test/test1:test/test2
experiment: a.c d.c
echo $^
将以完整路径回显test/test1/a.c test/test2/d.c
。
因此,您可以从%.o
规则中删除硬编码的目录名称,只需指定要为.o
目标构建的all
个文件。