2011-07-05 12 views
4

これは私の現在のメイクファイルの設定です。 public01.cpublic02.cなどの名前のファイルがあります。私は、それぞれにワイルドカードでpublic*.oラベルを使用してオブジェクトファイルを作成しようとしています。私が試してみて、メイクファイルを実行するとメイクファイルとワイルドカード

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

public*: public*.o 
    $(CC) -o public* public*.o 

はしかし、私はこれを取得:

make: *** No rule to make target `public*.c', needed by `public*.o'. Stop. 

私は私が好きな、それはワイルドカードをラベルとしてpublic*.cを処理していないと思います。私は$(wildcard pattern...)の機能について読んで、それを試してみましたが、実際にそれを理解していなかったり、うまく動作していませんでした...

答えて

12

短い回答:その構文は、あなたが望むように動作しません。

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

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

長い答え:この:

public*.o: public*.c hashtable.h 

は、あなたはそれが意味したいのかという意味ではありませんが、構文を作るあなたはGNUでやりたいための正しい方法は、パターンルールを使用することです。ビルドの開始時に、など、あなたがなど、いくつかのファイル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 

はあなたが右の欲しいもののように思えますか?

public01.o: public01.c public02.c ... hashtable.h 
public02.o: public01.c public02.c ... hashtable.h 

であること - すべての.oファイルごと.cファイルに依存している。しかし、それはラインがまさにこれと同じであるという事実であるため、メイクと共通の誤解です!あなたが望むことを行う正しい方法は、上記のようにパターンルールを使用することです。

+0

+1ですが、レシピに 'public $ * .c'、' public $ *。o'、 'public $ *'、もっと良い '$ <'と '$ @'は必要ありません。 ? – eriktous

+0

@eriktous:whoops、それはコピー貼り付けられたoです。今修正しました。指摘してくれてありがとう。 –

0

gccはファイルが存在しないと考えているため、存在することを確認し、存在するディレクトリにいることを確認してから、動作するはずです。

また、パブリック*に$(CFLAGS)がない理由は何ですか?なぜそれは公に*なのですか?単に「公衆」を持っていれば十分だと私は信じています。

関連する問題