2012-10-28 8 views
7

の下で私のCのディレクトリ構造をメイクファイルを使用して、すべてのCPPファイルをコンパイル++プロジェクトが
MinGWの

/.. 
    makefile  <- the makefile is in root 
    /include  <- subdirectory that has to be included while compiling 
    /obj   <- target place for all *.o and final executable 
    /src   <- sources 

され、私の現在のメイクファイルは、次のとおりです。

CC=g++ 
CFLAGS=-c -Wall -std=c++11 

INC=-Iinclude 
SRC=src 
TGT=obj 

all: myapp 

myapp: myapp.o 
    $(CC) $(TGT)/myapp.o -o $(TGT)/myapp 

myapp.o: 
    $(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o 

clean: 
    rm -rf $(TGT) 
    mkdir $(TGT) 

は、これが私の最初のファイルのために働きました。私はmakefileの初心者です - /srcディレクトリのすべてのファイルをコンパイルし、/objディレクトリの実行可能ファイルにリンクしてください。

src/myapp.c 
obj/Makefile 

は、既存のMakefileを取るobj/に移動、$(TGT)$(SRC)への参照を省略します。

メイクファイルはWindowsで動作するように持って、私はあなたがVPATH for separating source and object filesを使用することができますMinGWのとMSYS

答えて

5

ソースファイルのリストを追加します。

SOURCES = $(wildcard $(SRC)/*.cpp) 

とオブジェクトファイルを対応のリスト:

OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o))) 

とターゲットの実行ファイル:

$(TGT)/myapp: $(OBJS) 
    $(CXX) $(LDFLAGS) $(OBJS) -o [email protected] 

オブジェクトを構築するためのルール:

$(TGT)/%.o: $(SRC)/%.cpp 
    $(CXX) $(CXXFLAGS) -c $< -o [email protected] 

今、あなたは指定する必要がありますがg ++のためのオプションは次のとおりです。

INCLUDES = -Iinclude 
CXXFLAGS = -Wall -std=c++11 $(INCLUDES) 

と一緒にすべて:

SRC=src 
TGT=obj 
INCLUDES = -Iinclude 
CXXFLAGS = -Wall -std=c++11 $(INCLUDES) 
SOURCES = $(wildcard $(SRC)/*.cpp) 
OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o))) 

$(TGT)/%.o: $(SRC)/%.cpp 
    $(CXX) $(CXXFLAGS) -c $< -o [email protected] 

$(TGT)/myapp: $(OBJS) 
    $(CXX) $(LDFLAGS) $(OBJS) -o [email protected] 

それは$(CXX) ...の前で「タブが存在しなければならないこと、が重要です"文字、スペースではありません。

+0

'-Idir'部分をパラメータ化できますか?あなたのソリューションは簡潔に見えます。しかし、変更するには2つのことがあります。メークスクリプトはTGTディレクトリに '* .o'と最後の実行可能ファイルの両方を置く必要があります... – emesx

+0

パラメータ化されたとはどういう意味ですか?これを別の変数に入れて、この変数を 'CXXFLAGS'に追加することもできます。修正された解答を参照 –

+1

@elmes変更された 'Makefile'を試してください。別のターゲットディレクトリを調整しました。 –

1

を使用しています以下を追加してください:

VPATH=../src 

ar電子をしようとしていますmulti-architecture builds, VPATH is not ideal


ご参考までに、builtin rulesを大文字にしません。あなたは

CC=g++ 
CFLAGS=-c -Wall -std=c++11 
myapp: myapp.o 
    $(CC) $(TGT)/myapp.o -o $(TGT)/myapp 

myapp.o: 
    $(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o 

を持っているあなたはどこの代わりに使用できます。

CXXFLAGS=-Wall -std=c++11 
CXXFLAGS+=$(INC) 
LDLIBS+=-lstdc++ 

myapp: myapp.o 

をので、それをすべて合計すると、新しいobj/Makefile次のようになります。

VPATH=../src 
INC=-I../include 
CXXFLAGS=-Wall -std=c++11 
CXXFLAGS+=$(INC) 
LDLIBS+=-lstdc++ 

myapp: myapp.o 

することができます必要に応じて別のMakefileを作成してobj/からこの新しいものに再帰します。

all: obj/myapp 

obj/myapp: 
    mklink obj/Makefile ../Makefile 
    $(MAKE) --directory=obj/ 
+0

私が言ったように、私はmakefilesに新しいです。この質問に記載されているシナリオに合った実例を作成できますか? – emesx

+0

OK、例から紛失したのはVPATHだけです。だからそこに行く。 –

+0

しかし、なぜmakefileが 'obj'ディレクトリに存在しなければならないのですか?そのディレクトリを簡単にクリアしたいので、それを保存するのは良い場所ではありません – emesx