のは 、ビルドに必要なCソースファイルがbar.c
であると仮定し、それはあなたがlist.cpp
に-ing #include
ある関連するヘッダファイルbar.h
を持っており、あなたが正しくコーディングしているということをしてみましょうextern C
ボイラープレートbar.h
その後、次のメイクファイルは、何が必要でしょう。
1.使用の即時評価(:ここでは学習のポイントがたくさんあります
CXX_SOURCES := list.cpp
C_SOURCES := bar.c
OBJECTS = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o)
CXXFLAGS := -g -Wall -std=c++11
CFLAGS := -g -Wall
CPPFLAGS :=
LDFLAGS :=
LDLIBS :=
EXEC := a.out
.PHONY: all clean test
all: $(EXEC)
test: $(EXEC)
./$<
$(EXEC): $(OBJECTS)
$(CXX) $(LDFLAGS) $^ -o [email protected] $(LDLIBS)
list.o: bar.h
clean:
rm -f $(EXEC) *.o
のMakefile :=
)ではなく、再帰的評価(=
)が である再帰的な評価が必要です。ターゲットは単にタスクの名前ではなく、タスクが作成されます ファイルの名前である場合、それはphony target だ、 6.2 The Two Flavors of Variables
2.を参照してください、あなたはそれが偽りであることをmake
を教えてくださいターゲット、のような:
.PHONY: all clean test
それはあなたのように、うまく実行 としてプログラムにプログラムを構築するメイクレシピの正常ではない 3.:
@$(CXX) $(OBJECTS) -o [email protected] && $(EXEC)
あなたは常にあなたがそれを構築したという理由だけでプログラムを実行したくない、および プログラムが実行されている-longまたは対話型のいずれかの場合、このアプローチ はビルドにそれがimpractialようになりますプログラムはまったくありません。
恐らく、正しく構築されたテストにプログラムを実行したいと考えています。 ビルドは1つのタスクですが、テストは別のものです(時間がかかり、追加のリソースが必要です)。テスト用に別の偽のターゲット を提供する必要があります。私はこのメイクファイルでtest
と呼ばれています。多くの場合、check
と呼ばれています。 テストせずにプログラムをビルドするには、make
を実行してください。これをテストするには、 を実行してmake test
- これをでも(再)をビルドする必要がある場合は、プログラムをビルドします。
4.あなたはname.c
からname.o
を作るためにname.cpp
、または ルールからname.o
を作るためのルールを記述する必要はありません。
CC
::Cのコンパイルやリンクを起動するコマンドを、例えばGNU make
は、限り、あなたは正しく make
は、これらの組み込みルールで使用するメイク変数を設定してきたように、正しく これを行うためのbuiltin rulesを持っていますgcc
CXX
:C++コンパイルまたはリンケージを呼び出すコマンド。 g++
CFLAGS
:Cコンパイルするためのオプション
CXXFLAGS
:C++のコンパイル
CPPFLAGS
のオプション:C/C++プリプロセッサのオプション
5.従来の持っている二つのより重要なメイク変数意味は:
LDFLAGS
:リンケージのオプション、exライブラリ(-l
)オプション
LDLIBS
:ライブラリオプション(-l
)for linkage。上記の単純なmakefileで
、CPPFLAGS
、LDFLAGS
とLDLIBS
が必要 ではなく、省略さすることができます。代わりに、私は彼らの使用を説明するために空の値 を割り当てました。 make clean
はあなたに最初から何でもまたは全てを構築する準備ができて を取得するよう
6.メイクファイルは、メイクファイルを作成している可能性のあるすべてのファイルを削除します 偽のターゲットclean
を持つ必要があります。
。 name.o
がname.c
またはname.cpp
からコンパイルされている場合、 コースname.o
はname.c
に依存します。 name.cpp
が含まれていますが、は、が含まれているすべてのヘッダーファイルにも依存します。name.c
| name.cpp
、および メークファイルは、確実に動作するためには、これらの依存関係をすべて表現する必要があります。あなたがbar.h
を変更した場合、その後make
はfoo.o
が 期限が切れて、再作成するfoo.o
のためにそのレシピをさせていただきますことを確認するように
list.o: bar.h
:だから この場合、あなたは(少なくとも)のルールを必要としています。 複雑なプログラムの構築を開始すると、 はこれらのヘッダファイルの依存関係をすべて理解することができません。を参照すると、の自動依存性生成が見つかります。
ここにはthe GNU Make manual