Makefile和通配符

时间:2011-07-05 00:58:43

标签: makefile wildcard gnu

好吧,这是我目前的makefile设置。有些文件名为public01.cpublic02.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...)函数并使用它,但我并没有真正理解它或让它工作......

2 个答案:

答案 0 :(得分:12)

简短回答:该语法无法按您希望的方式运行。在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文件!正确的方法是使用模式规则,如上所示。

答案 1 :(得分:0)

通常会发生该错误,因为gcc认为该文件不存在。确保它存在,并确保你在它所在的目录中,然后它应该工作。

另外,你没有为公众提供$(CFLAGS)*的任何理由?为什么公开*?我相信,仅仅拥有“公共”就足够了。