2011-07-05 53 views
4

好了,所以这是我的一个makefile当前设置。有哪些是命名public01.cpublic02.c,等我试图让目标文件为他们每个人的使用public*.o标签与通配符文件。Makefile文件和通配符

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...)函数并玩过它,但我并没有真正理解它或让它工作...

回答

12

简短的回答:该语法不工作,你希望它的方式。正确的方法做你想要在GNU使语法什么是使用模式规则:

public%.o: public%.c hashtable.h 
     $(CC) $(CFLAGS) -c $< 

public%: public%.o 
     $(CC) -o [email protected] $< 

龙回答:此:

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文件的依赖!如你所愿,正确的做法是使用模式规则,如上所示。

+0

+1,但并不需要'公共$ *。C','公共$ *。O'和'$公众*'的食谱,或者更好'$ <'和'$ @' ? – eriktous

+0

@eriktous:哎呦,这是一个复制粘贴-O。现在修复,谢谢指出。 –

0

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

此外,任何原因,你不为公众有$(CFLAGS)*?为什么它公开*?我相信只要拥有“公共”就足够了。