好了,这是我当前的makefile设置。有些文件名为public01.c
,public02.c
等。我正在尝试使用带有通配符的public*.o
标签为每个文件创建目标文件。
public*.o: public*.c hashtable.h
$(CC) $(CFLAGS) -c public*.c
public*: public*.o
$(CC) -o public* public*.o
但是,当我尝试运行makefile时,得到以下信息:
make: *** No rule to make target `public*.c', needed by `public*.o'. Stop.
我想这是将
public*.c
视为标签,而不是我想要的通配符。我阅读了有关$(wildcard pattern...)
的函数并对其进行了试用,但我并不真正了解它或无法使其正常工作... 最佳答案
简短回答:该语法无法按您希望的方式工作。在GNU make语法中执行所需操作的正确方法是使用模式规则:
public%.o: public%.c hashtable.h
$(CC) $(CFLAGS) -c $<
public%: public%.o
$(CC) -o $@ $<
详细回答:这:
public*.o: public*.c hashtable.h
并不代表您想要的意思。假设您在构建开始时就有几个文件
public01.c
等,而没有文件public01.o
等,那么该语法与此等效:public*.o: public01.c public02.c public03.c ... hashtable.h
也就是说,如果
public01.o
等不存在,那么make将使用文字字符串public*.o
作为文件名。如果确实存在某些.o
文件,则该语法与此等效:public01.o public02.o ...: public01.c public02.c ... hashtable.h
看起来像您想要的一样吗?但这是对make的常见误解,因为实际上该行与此完全相同:
public01.o: public01.c public02.c ... hashtable.h
public02.o: public01.c public02.c ... hashtable.h
也就是说-每个
.o
文件都依赖于每个.c
文件!正确执行操作的方法是使用模式规则,如上所示。