我有文件main.c
,version1.c
,version2.c
和header.h
version1.c
和version2.c
是同一个头文件(header.h
)的两种不同实现,main.c
使用此头文件。
现在,我想
$ make v1
cc -c main.c
cc -c version1.c
cc -o prog main.o version1.o
或
$ make v2
cc -c main.c
cc -c version2.c
cc -o prog main.o version2.o
取决于我正在使用的代码版本。
我试过Conditionally appending to a variable inside a Makefile target并写了
.PHONY: v1 v2
OBJ = main.o
v1: OBJ += version1.o
v2: OBJ += version2.o
v1 v2: prog
prog: $(OBJ)
cc -o prog $(OBJ)
%.o: %.c header.h
cc -c $<
但这根本不起作用:
$ make v1
cc -c main.c
cc -o prog main.o version1.o
cc: version1.o: No such file or directory
make: *** [prog] Error 1
似乎make
在附加内容之前评估$(OBJ)
,当它出现在依赖项列表中时,在之后它出现在命令列表。
这是make
中的错误吗?或者我只是做错了?我该如何正确地做到这一点?
答案 0 :(得分:1)
变量(v1: OBJ += version1.o
)的特定于目标的修改适用于规则的主体,而不是先决条件列表。我就是这样做的:
.PHONY: v1 v2
v1: version1.o
v2: version2.o
v1 v2: main.o
cc -o prog $^
%.o: %.c header.h
cc -c $<