私の単純な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.o
run
make
link.o
main.o
sum.o
link.o
main.o
sum.o
main.o
sum.o
link.o
答え1
前の質問と重複する可能性があります。makeで「システムが指定されたファイルを見つけることができません」問題の正確な原因は何ですか?しかし、これを使って何が起こっているのかを詳しく説明します。
MakeはMakefile宣言を文字通り受け入れます:
run: link
run
が必要だと言うと、link
関連するレシピが を作成してrun
実行する必要があることを指示します。gcc link.o -o run
link.o: main.o sum.o
とがlink.o
必要であることを知らせ、関連するレシピが作成するように指示したら実行する必要があります。main.o
sum.o
link.o
ld -r main.o sum.o -o link.o
main.o: main.c
main.o
が必要だと言うと、main.c
関連するレシピが を作成してmain.o
実行する必要があることを指示します。gcc -c main.c -o main.o
sum.o: sum.c
sum.c
同じことをするsum.o
走るとき
make
Makefileが最初の目標を満たすことを試みると、ファイルはrun
なくlink
、Makefileでビルド方法を指定しませんlink
。.o
ファイルから拡張子のないファイルを作成する方法を「知る」。ので、組み込みのルールを使用してlink
。
cc link.o -o link
これがcc
コマンドのソースです(厳密に言えば、Make変数のデフォルト値です$(CC)
)。
利用可能になると、link
Makeは前提条件が満たされたと仮定し、run
適切なレシピを実行します。
gcc link.o -o run
気づくlink
実際に使用されていないここで。状況を混乱させるだけです。最初の規則は次のように書く必要があります。
run: link.o
具体的には、Makeはrun
次のように解析します。
run
必要link
link
明示的なルールはありませんが、組み込みルールを使用してビルドできます。link.o
link.o
必要main.o
sum.o
main.o
main.c
実存的な欲求sum.o
sum.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.o
sum.o
main.o
main.c
実存的な欲求sum.o
sum.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