Makefileは構築するhello
のいずれかの場合には実行可能ファイルをmain.cpp
、hello.cpp
、factorial.cpp
変更しました。その仕様を達成するための最小のMakefileは次のようになります。
hello: main.cpp hello.cpp factorial.cpp
g++ -o hello main.cpp hello.cpp factorial.cpp
- プロ:非常に読みやすい
- con:メンテナンスの悪夢、C ++依存関係の重複
- con:効率の問題、1つだけが変更された場合でも、すべてのC ++を再コンパイルします
上記を改善するために、編集されたC ++ファイルのみをコンパイルします。次に、結果のオブジェクトファイルをリンクするだけです。
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
main.o: main.cpp
g++ -c main.cpp
hello.o: hello.cpp
g++ -c hello.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
- pro:効率の問題を修正
- 短所:新しいメンテナンスの悪夢、オブジェクトファイルの誤植の可能性
これを改善するために、すべてのオブジェクトファイルルールを単一の.cpp.o
ルールに置き換えることができます。
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o $@
ここでは.cpp.o
ルールが構築する方法を定義しますanyfile.o
からanyfile.cpp
。
$<
この場合、最初の依存関係に一致します。 anyfile.cpp
$@
ターゲット、この場合はと一致しanyfile.o
ます。
Makefileに存在するその他の変更は次のとおりです。
- コンパイラをg ++から任意のC ++コンパイラに簡単に変更できます。
- コンパイラー・オプションを簡単に変更できるようにします。
- リンカオプションの変更を容易にします。
- C ++ソースファイルと出力の変更を容易にします。
- アプリケーションをビルドする前に、すべてのソースファイルが存在することを確認するクイックチェックとして機能するデフォルトルール「all」を追加しました。