1

Linuxでp.c使用してファイルを実行可能ファイルにコンパイルする単純なmakefileがあります。gccファイルはp.cファイルに依存しa.hます。私のメイクファイルは次のようになります。

//makefile
CC = gcc

build: p.c a.h
    $(CC) -o out p.c
clean:
    rm -f *.exe
rebuild: clean build
4

6 に答える 6

6

buildあなたのメイクファイルは、それが生成すると約束しているファイル、つまり、cleanおよびを生成しませんrebuild。これらのターゲットはファイルではないため、偽のターゲットとしてマークする必要があります。

.PHONY: build clean rebuild

buildターゲットは次のとおりです。

build : out

out : p.c a.h
    $(CC) -o $@ p.c
于 2012-09-24T10:50:49.407 に答える
2

この部分

build: p.c a.h
    $(CC) -o out p.c

「$(CC)-o out pcでコンパイルすると、結果は「build」という名前のファイルになります」と表示されます。あなたが嘘をついたのでmake(これは代わりにファイルを作成しoutます)、それは再び'build'を構築しようとします。

ここにMakefileライター向けのレッスンがあり$@ます。このエラーを回避するために、常に変数(ターゲットを示す)を使用してください。

out: p.c a.h
    $(CC) -o $@ p.c

詳細については、Makefileに関するPaulのルールを参照してください。

于 2012-09-24T11:16:11.770 に答える
1

学習者、これは変数を使用して実行可能ファイルの名前を格納する例です。このように、Makefile の最初の 1 か所で指定するだけで済みます。

EXECUTABLE = out

.PHONY: build clean rebuild

build: $(EXECUTABLE)

$(EXECUTABLE): p.c a.h
    $(CC) -o $@ p.c

clean:
    rm -f $(EXECUTABLE)

rebuild: clean build

通常.c.hファイルも変数にリストされているため、ファイルが使用されているすべての場所を Makefile で検索することなく、ビルドからファイルを簡単に追加/削除できます。

于 2012-09-24T13:11:33.047 に答える
0

常にソースを再コンパイルすることを避けたい場合は、ターゲットはソース ファイルではなくオブジェクトファイルに依存する必要があります。

target.exe : ポ
        $(CC) -o $@ $?;

ポ:パソコンああ
        $(CC) -c $@ $?;

典型的な makefile には、通常、オブジェクト ファイルごとに明示的なルールはなく、実装とヘッダー ファイル間の明示的な依存関係も通常リストしません。通常、次のような暗黙のルールが表示されます

%.o : %.c
        $(CC) -c $(CFLAGS) $?;

(場所$?はそのターゲットの前提条件のリストを示します) または、プロジェクトが非常に単純な場合 (1 つのソース ファイル)、それは必要ありません。あなたは通常逃げることができます

すべて: ターゲット ターゲット: target.o

という名前のファイルがあると仮定すると、上記はデフォルトのコンパイラと CFLAGS オプションを使用して target.cビルドされます。target

同様に、典型的なメイクファイル (少なくとも私の経験では) は、ヘッダーの依存関係を明示的にリストしません。むしろ、これらの依存関係リストを自動的に生成するコンパイラ オプションに依存しています (gcc の場合、そのオプションは です-M)。例については、こちらを参照してください。

于 2012-09-24T16:17:35.967 に答える
0

Makefile の一般的な構文は次のとおりです。

target : dependencies
    commands to make target from dependencies

したがって、Makefile は、ターゲットbuildを使用して呼び出されるファイルを作成することを期待しています。build : p.c a.hコマンドは make を呼び出すたびに実際にこのファイルを作成しないため、コマンドをやり直す必要があります。

(PS: Linux バイナリには .exe 拡張子がありません)

于 2012-09-24T10:51:41.233 に答える