誰かが私が次のmakeファイルを理解するのを手伝ってもらえますか?
BINS=file1 file2 file3
all: $(BINS)
clean:
rm -f $(BINS) *~
$*: $@.c
gcc -g -o $@ $?
これが私の質問です:
- gccの-gオプションとは何ですか?
- $*と$@とは何ですか
- 最後のターゲットを実行することをどのようにして知るのですか?
ありがとう!
gcc
およびmake
ドキュメントから:
「-g オペレーティング システムのネイティブ形式でデバッグ情報を生成します」。
を。"$* 暗黙のルールが一致する語幹 (パターンの一致方法を参照)。ターゲットが dir/a.foo.b で、ターゲット パターンが a.%.b の場合、語幹は dir/foo です。語幹は関連するファイルの名前を作成するのに便利です。静的パターン ルールでは、語幹はターゲット パターンの '%' に一致するファイル名の一部です。"
b. "$@ ルールのターゲットのファイル名。ターゲットがアーカイブ メンバーの場合、「$@」はアーカイブ ファイルの名前です。複数のターゲットを持つパターン ルールでは (パターン ルールの概要を参照)、 「$@」は、ルールのコマンドを実行させたターゲットの名前です。"
c. "$? ターゲットよりも新しいすべての前提条件の名前で、それらの間にスペースがあります。" (質問されていませんが、追加する価値があります。)
"'all' プログラム全体をコンパイルします。これをデフォルトのターゲットにする必要があります。"
この例の makefile は、C プログラムのみをビルドするように見えるため、少し制限されています。GNU makeには、makefile の書き方を学習するのに役立つ、より広範な例がいくつかあります。
1.) gcc の -g オプションとは何ですか?
デバッグ情報を生成する
2.) $* と $@ とは
$*
ルールの幹です。のようにルールを作ると
%.ext: %.otherext
ext2otherext --input $? --output $@ --logfile $*.log
、そしてルールは から作成しようとしfile.ext
、file.otherext
次にログに記録しますfile.log
$@
はターゲット ファイル名です (file.ext
上記の場合)。
3.) 最後のターゲットを実行することをどのように認識しますか?
これは謎です。
$*
は中間ファイルに使用されます。たとえば、 から を作成しようとすると%.so
、ターゲットでもソースでもない中間ファイル%.c
が必要になります。%.o
あなたが置く:
%.so: %.c
gcc -fPIC -g -c -o $*.o $?
ld -shared -o $@ $*.o
言い換えれば、%.extension
原則として、以外の$*
すべて.extension
です。
対象としては$*
無意味。
このルールが実際にどこかで実行されていると確信していますか? Makefile を使用して再現しようとすると、cc -o
代わりにデフォルトのルール ( )が適用されます。gcc -g -o
必要なルールは次のようです。
%: %.c
gcc -g -o $@ $?
最初の行は、見ただけで期待どおりのことを行います — 名前のリストを作成し、それを に割り当てますBIN
。次に、 と呼ばれる make ターゲットall
が定義されます。これは、 にリストされているターゲットに依存します$BIN
(のall
各ターゲットがビルドされるまでビルドできません$BIN
)。 all
特別なビルド ターゲットです。たとえば、実行するだけでmake
はなくmake clean
、all
ターゲットが自動的にビルドされます。関連する実際のコマンドはありませんall
— すべての依存関係が構築されることを保証するだけです。最後のかなり単純なコマンドは、 と呼ばれるビルド ターゲットを定義します。これは、clean
リストされている各ファイル(ビルド ターゲットのリストとこの makefile 内のファイルのリストの両方として使用されていることに$BIN
注意してください) とすべてのバックアップを削除します。$BIN
次に、基本的に魔法のようなラインに行きます。 $*
「特に定義されていないもの」を意味する特別なビルドターゲットです。make
をビルドしようとすると、all
ターゲットが見つかり、その依存関係の作業が開始されます。しかし、ビルドしようとするとfile1
、明示的なターゲットが定義されていません。代わりに、を使用$*
してビルドしfile1
ます。同様に$@
、ビルドターゲットの名前とその依存関係 (マニュアルを確認した方がよいもの) に置き換えられ$?
ます。make
build に進むと、file1
ルール$*
により、次のルールが定義されているかのように動作します。
file1: file1.c
gcc -g -o file1 file1.c
最後に、この-g
オプションはデバッグ情報をコンパイルできるようにするだけです。
Q1 と Q2 はすでに広範囲にわたって回答されているため、Q3 のみについて簡単に説明します。
別のターゲットを指定しない限り、Make は常に最初のターゲットを実行します。これはデフォルト ターゲットとも呼ばれます。通常、デフォルトのターゲットは「all」と呼ばれます。