このMakefileに会う方法は?

このMakefileに会う方法は?

私の単純なMakefileは次のとおりです。

    #create an exe file
    run: link
            gcc link.o -o run
    
    #sketch link.o
    link.o: main.o sum.o
            ld -r main.o sum.o -o link.o
    
    #sketch main.o
    main.o: main.c
            gcc -c main.c -o main.o
    
    #sketch sum.o
    sum.o: sum.c
            gcc -c sum.c -o sum.o
    
    #make clean recipie
    clean:
            rm *.o
            rm run

このメイクファイルは多少未成熟または弱い場合があります。しかし、私が本当に興味を持っているのは、ターゲットがどのように合うかということです。実際の問題を説明する前に、まず出力を見てみましょう。

gcc -c main.c -o main.o
gcc -c sum.c -o sum.o
ld -r main.o sum.o -o link.o
cc   link.o   -o link
gcc link.o -o run

私の質問は次のとおりです。コマンドセクションの依存関係、linkまたはコマンドセクションの参照によるコマンドのrun検索依存関係に記載されているファイルのためですか、それともコマンドに記載されているファイルのためですか?link.orunmakelink.omain.o sum.olink.omain.o sum.omain.osum.olink.o

答え1

前の質問と重複する可能性があります。makeで「システムが指定されたファイルを見つけることができません」問題の正確な原因は何ですか?しかし、これを使って何が起こっているのかを詳しく説明します。

MakeはMakefile宣言を文字通り受け入れます:

  1. run: linkrunが必要だと言うと、link関連するレシピが を作成してrun実行する必要があることを指示します。gcc link.o -o run
  2. link.o: main.o sum.oとがlink.o必要であることを知らせ、関連するレシピが作成するように指示したら実行する必要があります。main.osum.olink.old -r main.o sum.o -o link.o
  3. main.o: main.cmain.oが必要だと言うと、main.c関連するレシピが を作成してmain.o実行する必要があることを指示します。gcc -c main.c -o main.o
  4. sum.o: sum.csum.c同じことをするsum.o

走るとき

make

Makefileが最初の目標を満たすことを試みると、ファイルはrunなくlink、Makefileでビルド方法を指定しませんlink.oファイルから拡張子のないファイルを作成する方法を「知る」。ので、組み込みのルールを使用してlink

cc link.o -o link

これがccコマンドのソースです(厳密に言えば、Make変数のデフォルト値です$(CC))。

利用可能になると、linkMakeは前提条件が満たされたと仮定し、run適切なレシピを実行します。

gcc link.o -o run

気づくlink 実際に使用されていないここで。状況を混乱させるだけです。最初の規則は次のように書く必要があります。

run: link.o

具体的には、Makeはrun次のように解析します。

  • run必要link
  • link明示的なルールはありませんが、組み込みルールを使用してビルドできます。link.o
  • link.o必要main.osum.o
  • main.omain.c実存的な欲求
  • sum.osum.c実存的な欲求

これで前提条件が解決されたので、Makeはレシピを実行できます。

  • gcc -c main.o -o main.o立てるmain.o
  • gcc -c sum.c -o sum.o立てるsum.o
  • ld -r main.o sum.o -o link.o立てるlink.o
  • cc link.o -o link立てるlink
  • gcc link.o -o run立てるrun

runルールをに書き直すと、run: link.o回避策は次のように変更されます。

  • run必要link.o
  • link.o必要main.osum.o
  • main.omain.c実存的な欲求
  • sum.osum.c実存的な欲求

そしてビルド

  • gcc -c main.o -o main.o立てるmain.o
  • gcc -c sum.c -o sum.o立てるsum.o
  • ld -r main.o sum.o -o link.o立てるlink.o
  • gcc link.o -o run立てるrun

関連情報