我有makefile
执行以下操作:
FILES=file1.c file2.c file3.c subdir1/afile1.c subdir2/bfile1.c
OBJS=$(FILES:.c=.o)
all: $(OBJS)
这会将目标文件写入与源文件相同的目录,但我不想这样做。我希望将它们写入名为" objs"," objs / subdir1"的单独子目录中。和" objs / subdir2"所以我尝试了以下内容:
OBJS=$(FILES:.c=objs/.o)
但这不起作用。我也试图像这样创建一个新规则:
%.o: %.c:
$(CC) -o objs/$@ $(CFLAGS) $*.c
但是这会导致以下错误:
Mixed implicit and static pattern rules. Stop.
那么将对象文件存储在" objs"中的最简单方法是什么?镜像源文件目录结构的子目录?即file1.o
,file2.o
...应该进入" objs",afile1.o
应该进入" objs / subdir1"并且bfile1.o
应该进入" objs / subdir2"?
答案 0 :(得分:1)
在我的评论中提到,如果你想在子目录中创建目标,你必须通过在规则中修改目标来告诉make你想要的东西......只是修改编译器命令是不够的因为make我对食谱的作用一无所知。
将您的规则写为:
OBJS = $(FILES:%.c=objs/%.o)
objs/%.o : %.c
$(CC) -o $@ $(CFLAGS) $<
答案 1 :(得分:0)
也许不是您想要的,但您可以使用VPATH更改来源搜索路径。