2011-07-05 78 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)*?爲什麼它公開*?我相信只要擁有「公共」就足夠了。