0

file.cというファイルがあるとします。

  • file.c含むheader1.h
  • header1.h含むheader2.h

これが私がmakefileのために持っているものです:

file.x: file.o
        -gcc file.o -o file.x

file.o: file.c header1.h header2.h
        -gcc file.c header1.h header2.h

header2.hにheader1.hが含まれている場合の処理​​方法について混乱しています。

この回線は冗長ですか?それとも、依存関係を表示するのが良いスタイルですか?

file.c header1.h header2.h

更新:混乱をお詫び申し上げます。質問に対して行った編集を元に戻しました。現在のmakefileは、Jonathanの回答が参照している元の質問に投稿したものです。

4

1 に答える 1

2

質問の元のバージョンには、次の行が含まれていましたmakefile

file.o: file.c header1.h header2.h
        -gcc file.c header1.h header2.h

私の答えは、問題が修正される前の元のバージョンの質問に対応しています。

a.outコンパイラがヘッダーファイルのコンパイルに反対しない限り、コンパイル行が実行可能ファイルを生成することに注意してください。-cコマンドラインにあるはずです。


いくつかの問題:

  1. makefile、オブジェクトファイルを再構築する必要があるのはいつですか。

    回答:ソースファイルまたはヘッダーの1つに変更が含まれている場合。

    子会社Q:この依存関係の線はどういう意味ですか?

    file.o: file.c header1.h header2.h
    

    子会社A:file.oソースファイルまたはそれに含まれるヘッダーの1つが変更された場合は、再構築する必要があります。

  2. あなたが規定する場合:header1.hに依存します、あなたが変更するとどうなりますheader2.hか?header1.hheader2.h

    回答:何もありません。header1.hそれ自体はコンパイルしません。変更されるのはオブジェクトファイルです。

  3. file.c依存header1.hまたはheader2.hその両方を指定した場合、ヘッダーの1つを変更するとどうfile.cなりますか?

    回答:もう何もありません。あなたは変わらないfile.c; オブジェクトファイルを再度コンパイルします。

したがって、オブジェクトファイルルールの依存関係の部分は問題ありません(自動依存関係の生成に関連する制限内)。ソースファイルがヘッダーに依存しているというルールには意味がありません。実際、ソースファイルはヘッダーに直接依存していません。(ヘッダーの内容が変更されて有効なコードが有効でなくなった場合、ソースが修正されるまで何もコンパイルされないという点で間接的に依存します。ただし、それは主題から少し外れています。)

依存関係のハードコーディングには問題があります。それらは変化します。一方、依存関係を自動的に生成するのは面倒です。支援するGCCオプション(、、、、、、、、、、など—このよう-Mな豊富なオプションはここに 問題があることを示しています!)があり、GNUには-MM依存関係ファイルが存在する場合はそれを含める「条件付き包含」があります。彼らはしません。これらは役に立ちます。それを自動化する他の方法については、および関連するコマンドを調べてください。-MF-MG-MP-MQ-MD-MMD-MT-Hmakemakedependmkdep


自動依存関係の生成を無視すると、makefileは次のようになります。

FILES.o = file.o

file.x: ${FILES.o}
        ${CC} -o $@ ${CFLAGS} ${FILES.o} 

file.o: file.c header1.h header2.h

makeにコンパイルするコマンドを提供しfile.cますfile.o

プログラムも使用できるようになったら、マクロother.oに追加するだけです(そのため、複数形の名前になっています)。依存関係情報も追加できます。ライブラリも必要な場合は、リンク行にオプションを追加できます。other.oFILES.o

LDFLAGS = -L/usr/local/lib
LDLIBS  = -llocal

FILES.o = file.o other1.o other2.o

file.x: ${FILES.o}
        ${CC} -o $@ ${CFLAGS} ${FILES.o} ${LDFLAGS} ${LDLIBS}

file.o: file.c header1.h header2.h

ライブラリはオブジェクトファイルを追跡する必要があることに注意してください。オブジェクトファイルの前にライブラリをリストすると、他のプラットフォームでリンク時の障害が発生しやすく、ソフトウェアを構築しようとしている人を苛立たせます。

于 2013-03-27T00:09:35.633 に答える