1

makefile の機能をテストするための簡単なコード *make_test* を書きました。フォルダ構造は次のとおりです。

  1. include フォルダーにはmaths.hが含まれます

    float add(float a, float b) 
    {
        return a+b;
    }
    
  2. メインファイルには次のコードが含まれています。

    # include <stdio.h>
    # include <include/maths.h> 
    
    int main(int argc, char** argv) 
    {
        float a=1; 
        float b=4; 
    
        printf("%f + %f = %f\n", a, b, add(a, b));
        return 0;
     }
    
  3. 以下を含むメイクファイル:

    IDIR = -I.
    DEPS = ./include/maths.h
    CC= gcc -Wall -g $(IDIR)
    
    program: make_test.o
    
    %.o: test/%.c $(DEPS)
        @echo "Rule 1 was called"
        $(CC) -o $@ $<
    
    %.o: test/%.c $(DEPS)
        @echo "Rule 2 was called"
        $(CC) -o $@ $<
    
    %.o: test/%.c $(DEPS)
        @echo "Rule 3 was called"
        $(CC) -o $@ $<
    

テストのために意図的に挿入された test/%.c ステートメントがあることに注意してください。テストフォルダはありません。メイン ファイルに変更を加え、コマンド ラインで make と入力すると、次のようになります。

    gcc -Wall -g -I.    -c -o make_test.o make_test.c

私の質問は、 -c フラグをどこにも追加していないのに、なぜ出力に表示されるのですか? 依存関係が存在しない (test/%.c) か変更されている (include/maths.h) ため、「何もする必要はありません」という出力があるべきではありませんか?

ありがとう、

4

1 に答える 1

5

Make には多数の組み込みルールが含まれています。次のようなものを実行すると、それらを見ることができますmake -p -f /dev/null。これらのルールの 1 つがコードのコンパイルに使用されており、-cフラグが含まれています。

組み込みルールが使用されるのはなぜですか? 定義したルールが一致しないためです。これらは、サブディレクトリ内の.oファイルからファイルを構築する方法を make に指示します。ただし、ファイルはサブディレクトリにないため、これらのルールは make で使用できません。したがって、make は組み込みの規則を調べて、この同じディレクトリ内の aから aを構築できる規則を見つけ、それを見つけて使用します。.ctestmake_test.ctest.o.c

make_test.cファイルをサブディレクトリに移動するtestと、ルールが使用されます。

ただし、ここでは make が正しいことに注意してください。出力-cが必要な場合は、コンパイラの呼び出しにフラグを追加する必要があり.oます。あなたのルールはオブジェクトファイルを作成しませんxxx.o。かなり紛らわしい名前の実行可能ファイルを作成します。

于 2013-05-26T14:50:15.800 に答える