A次のようにわずかに良い解決策は次のようになります、私はファンキーな物事のカップルをお知らせやってんだけど、私は[OK]を、第一及び第二のターゲットを見てみましょ方法
all: build/cpptest
.PHONY: all
build:
@echo "building directory [email protected]"
mkdir -p [email protected]
build/cpptest: build/main.o | build
@echo building [email protected]
g++ -o [email protected] $^
build/main.o: main.cpp | build
@echo building [email protected]
g++ -o [email protected] -c $^
clean:
@echo cleaning...
rm -f build/*
に沿って説明します:
all: build/cpptest
.PHONY: all
all
という名前のデフォルトターゲットを作成しました。これはダミーのターゲットです(実際にはall
というファイルは作成されません)。all
に.PHONY
の依存関係を設定して、偽のマークを付けました。 (これは基本的に、all
という新しいファイルがすでに存在する場合、all
ルールを無視しないようにmakeに指示します)。 all
にはレシピがありません。したがって、依存関係が作成される以外は何も行いません。これは少し畳み込まれているように見えるかもしれませんが、メイクファイルでは標準的な方法です。
第3目標:最初の目標のために
build:
@echo "building directory [email protected]"
mkdir -p [email protected]
、構築、これは、作成するディレクトリの名前です。 build
はターゲットであり、依存関係はなく、2つのレシピ・ラインがあります。最初のレシピ行は@
で始まります。これは、レシピを実行する前にレシピを印刷しないことを意味します。あなたがこれを持っていなかったらあなたの出力は次のようになります:
echo "building directory build"
building directory build
これは醜いです。 @
は、それが行の先頭にある場合にのみ行います。後であなたは[email protected]
を持っていることに気付くでしょう。これは違う。これは、ターゲットの名前(この場合はbuild
)に展開される変数です。後でより複雑なmakefileを単純化するので、この変数を適切なものにするのは良い習慣です。 build
ターゲットの2番目のレシピがディレクトリを作成します。
第四ターゲット:
build/cpptest: build/main.o | build
@echo building [email protected]
g++ -o [email protected] $^
これはbuild/cpptest
は(すなわち、他の二つが行われるまで、これらの構築を開始していない)build/main.o
とbuild
に依存していると言います。 1つの大きいcaviate:の前に|
記号に気づく。これにより、注文のみの依存関係になります。つまり、build
ディレクトリがすでに存在し、そのタイムスタンプがbuild/cpptest
より新しい場合は、build/cpptest
が期限切れである(再構築しない)とはみなされません。一方、その他の依存関係は、|
シンボルの左側にあります。これは、build/main.o
が存在しない場合、またはNEWERがbuild/cpptest
より大きい場合、makeはbuild/cpptest
を再構築する必要があることをmakeに伝えます。
build
に|
(注文のみの依存関係)が必要な理由は、新しいファイルを追加するたびにディレクトリの日付が更新されるためです。したがって、build
は常にbuild/cpptest
より新しいタイムスタンプを持ちます。この種のものは、先進的なmakefileのものの下にありますが、これを行うのは適切な方法なので、私はここに示したいと考えました。
@Felixが指摘したように、注文版はすべてのバージョンのmakeで利用できるわけではありません(GNU makeはサポートしています)。
レシピについては、[email protected]
変数と$^
変数を使用しました。 $^
はすべての非順序依存性を表します(この場合はmain.cpp
)。ルールは、ルールが実行される前に展開されます。
これを本当に適切にする(例えば$(objs)
などの変数を定義する)ことができます。これにより、メイクファイルは将来も維持しやすくなりますが、うまくいけばよいでしょう。
https://www.google.com/search?q=makefile+tutorial –
私は最初の4つの結果を見ましたが、ディレクトリを挙げたものは最初に他のものを導入したので、著者は混乱したディレクトリのマクロ名や変数名を取得したように見えました。 –