4

誰かが私が次のmakeファイルを理解するのを手伝ってもらえますか?

BINS=file1 file2 file3

all: $(BINS)

clean: 
        rm -f $(BINS) *~ 

$*: $@.c
        gcc -g -o $@ $?

これが私の質問です:

  1. gccの-gオプションとは何ですか?
  2. $*と$@とは何ですか
  3. 最後のターゲットを実行することをどのようにして知るのですか?

ありがとう!

4

5 に答える 5

5

gccおよびmakeドキュメントから:

  1. 「-g オペレーティング システムのネイティブ形式でデバッグ情報を生成します」。

  2. を。"$* 暗黙のルールが一致する語幹 (パターンの一致方法を参照)。ターゲットが dir/a.foo.b で、ターゲット パターンが a.%.b の場合、語幹は dir/foo です。語幹は関連するファイルの名前を作成するのに便利です。静的パターン ルールでは、語幹はターゲット パターンの '%' に一致するファイル名の一部です。"

    b. "$@ ルールのターゲットのファイル名。ターゲットがアーカイブ メンバーの場合、「$@」はアーカイブ ファイルの名前です。複数のターゲットを持つパターン ルールでは (パターン ルールの概要を参照)、 「$@」は、ルールのコマンドを実行させたターゲットの名前です。"

    c. "$? ターゲットよりも新しいすべての前提条件の名前で、それらの間にスペースがあります。" (質問されていませんが、追加する価値があります。)

  3. "'all' プログラム全体をコンパイルします。これをデフォルトのターゲットにする必要があります。"

この例の makefile は、C プログラムのみをビルドするように見えるため、少し制限されています。GNU makeには、makefile の書き方を学習するのに役立つ、より広範な例がいくつかあります。

于 2009-01-29T20:36:07.420 に答える
3

1.) gcc の -g オプションとは何ですか?

デバッグ情報を生成する

2.) $* と $@ とは

$*ルールの幹です。のようにルールを作ると

%.ext: %.otherext
    ext2otherext --input $? --output $@ --logfile $*.log

、そしてルールは から作成しようとしfile.extfile.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 $@ $?
于 2009-01-29T20:39:02.780 に答える
1

GNUメイクマニュアル

GCCオンラインドキュメント

于 2009-01-29T20:28:40.837 に答える
1

最初の行は、見ただけで期待どおりのことを行います — 名前のリストを作成し、それを に割り当てますBIN。次に、 と呼ばれる make ターゲットallが定義されます。これは、 にリストされているターゲットに依存します$BIN(のall各ターゲットがビルドされるまでビルドできません$BIN)。 all特別なビルド ターゲットです。たとえば、実行するだけでmakeはなくmake cleanallターゲットが自動的にビルドされます。関連する実際のコマンドはありませんall— すべての依存関係が構築されることを保証するだけです。最後のかなり単純なコマンドは、 と呼ばれるビルド ターゲットを定義します。これは、cleanリストされている各ファイル(ビルド ターゲットのリストとこの makefile 内のファイルのリストの両方として使用されていることに$BIN注意してください) とすべてのバックアップを削除します。$BIN

次に、基本的に魔法のようなラインに行きます。 $*「特に定義されていないもの」を意味する特別なビルドターゲットです。makeをビルドしようとすると、allターゲットが見つかり、その依存関係の作業が開始されます。しかし、ビルドしようとするとfile1、明示的なターゲットが定義されていません。代わりに、を使用$*してビルドしfile1ます。同様に$@、ビルドターゲットの名前とその依存関係 (マニュアルを確認した方がよいもの) に置き換えられ$?ます。makebuild に進むと、file1ルール$*により、次のルールが定義されているかのように動作します。

file1: file1.c
        gcc -g -o file1 file1.c

最後に、この-gオプションはデバッグ情報をコンパイルできるようにするだけです。

于 2009-01-29T20:41:20.513 に答える
0

Q1 と Q2 はすでに広範囲にわたって回答されているため、Q3 のみについて簡単に説明します。

別のターゲットを指定しない限り、Make は常に最初のターゲットを実行します。これはデフォルト ターゲットとも呼ばれます。通常、デフォルトのターゲットは「all」と呼ばれます。

于 2009-01-29T20:40:50.297 に答える