好吧,这是我当前的 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 $@ $<
长答案: This:
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
文件!执行您想要的操作的正确方法是使用模式规则,如上所示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)