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
build
あなたのメイクファイルは、それが生成すると約束しているファイル、つまり、clean
およびを生成しませんrebuild
。これらのターゲットはファイルではないため、偽のターゲットとしてマークする必要があります。
.PHONY: build clean rebuild
build
ターゲットは次のとおりです。
build : out
out : p.c a.h
$(CC) -o $@ p.c
この部分
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のルールを参照してください。
学習者、これは変数を使用して実行可能ファイルの名前を格納する例です。このように、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 で検索することなく、ビルドからファイルを簡単に追加/削除できます。
常にソースを再コンパイルすることを避けたい場合は、ターゲットはソース ファイルではなくオブジェクトファイルに依存する必要があります。
target.exe : ポ $(CC) -o $@ $?; ポ:パソコンああ $(CC) -c $@ $?;
典型的な makefile には、通常、オブジェクト ファイルごとに明示的なルールはなく、実装とヘッダー ファイル間の明示的な依存関係も通常リストしません。通常、次のような暗黙のルールが表示されます
%.o : %.c $(CC) -c $(CFLAGS) $?;
(場所$?
はそのターゲットの前提条件のリストを示します) または、プロジェクトが非常に単純な場合 (1 つのソース ファイル)、それは必要ありません。あなたは通常逃げることができます
すべて: ターゲット ターゲット: target.o
という名前のファイルがあると仮定すると、上記はデフォルトのコンパイラと CFLAGS オプションを使用して target.c
ビルドされます。target
同様に、典型的なメイクファイル (少なくとも私の経験では) は、ヘッダーの依存関係を明示的にリストしません。むしろ、これらの依存関係リストを自動的に生成するコンパイラ オプションに依存しています (gcc の場合、そのオプションは です-M
)。例については、こちらを参照してください。
Makefile の一般的な構文は次のとおりです。
target : dependencies
commands to make target from dependencies
したがって、Makefile は、ターゲットbuild
を使用して呼び出されるファイルを作成することを期待しています。build : p.c a.h
コマンドは make を呼び出すたびに実際にこのファイルを作成しないため、コマンドをやり直す必要があります。
(PS: Linux バイナリには .exe 拡張子がありません)