1

だから私はメイクファイルについて学んでいますが、 $< と $? 本当に混乱しています。そういえば、$@ も私を混乱させます。

複数のターゲットがある場合、$@ は最初のターゲットを何を参照するのでしょうか? そして、2 番目のターゲットを参照したい場合はどうすればよいでしょうか?

$< は、現在の前提条件を指していると先生に言われました。ただし、彼のスライドには次のような例がありました。

.SUFFIXES: .c .o .cxx

.c.o:;$(CC) $(CFLAGS) -c $<

.cxx.o:; $(CXX) $(CXXFLAGS) -c $<

これは私には意味がありません。依存関係がない場合、 $< はどうやって何かを参照できるのでしょうか? 2 行目と 3 行目では、依存関係はありません。

$まで?行く、私はそれがより新しい前提条件リストであると聞きました、そしてこれは私にとって完全な専門用語です.

助けてくれてありがとう、私は過去1時間グーグルを試しましたが、それはすべて同じ簡潔なUNIXスピーチであり、私には理解するのが少し難しいです.

編集:追加する必要があります。2 行目と 3 行目の表記に混乱しています。スペース?

4

1 に答える 1

3

まず、make はプログラムを実行していないことに注意してください。make ファイルは一連の推論規則です。

あるものを別のものに変える方法をmakeに伝え、次に目標を与えます。次に、推論ルールを組み合わせて手順を把握し、途中でファイルのタイムスタンプをチェックして、不要な作業を繰り返さないようにします。

SUFFIXES は、ファイルで認識すべきサフィックスを make に指示します。

2 つの接尾辞をリストするルール: .co は、.c 接尾辞を持つ SINGLE ファイルを取得し、それを .o 接尾辞を持つ SINGLE FILE に変換するルールを示します。

cc -c x.c

xo をビルドする

.c.o:
<TAB>cc -c $<

「$<にあるソースファイルを取得し、このコマンドを使用して.oファイルに変換します」と言います

次に、次のようなルールを作成できます。

mycmd: x.o y.o z.o
<TAB>cc -o $@ $^

また、現在のディレクトリに 3 つの c ファイル (xc、yc、および zc) がある場合、make は、mycmd を作成するときに .o ファイルが必要であり、.o ファイルを作成できることを認識できると推測できます。 .c、そのようになります。

特別な変数の定義はこちら: http://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

したがって、(コマンドラインで)入力すると:

make mycmd

make はルールのリストを調べて、次のことを確認します。ああ、それを作成するには、xo、yo、および zo が必要です。次に、ディスクに移動します。xc、xo、yc、zc が見つかったとします。次のように考えます。

私は xo.. を持っていますが、.o ファイルは .c ファイルから作成されています... ソースが変更されたかどうかを確認する必要があります。タイムスタンプをチェックし、.c ファイルが .o ファイルよりも新しい場合は再構築します。

yc と zc については、cc を使用してそれらを .o ファイルに変換できることを認識しています。

xo が xc よりも新しいと仮定すると、make は次のようになります。

cc -c y.c
cc -c z.c
cc -o myprog x.o y.o z.o

次に make を再度実行すると、同じ手順が実行されますが、今回は myprog がすべての .o ファイルよりも新しいことがわかり、.o ファイルはすべて .c ファイルよりも新しいため、何もしません。

ここで、xc を編集して再度 make を実行するとします。一連のチェックを再度実行し、xc が xo よりも新しいことを検出し、再構築します。次に、mycmd が xo よりも古いことがわかります。そのため、再リンクします。

したがって、非常に短い一連のルールで、かなり多くの作業が行われます。

于 2012-10-18T03:51:39.430 に答える