2016-05-23 5 views
1

私は当初思ったほど単純なプロジェクト(少数のファイル)を作成しましたが、現在はプロジェクトが成長しています。ディレクトリ構造を再編成しようとしていますが、makefileの変更方法がわかりません。ここでMakefileでプロジェクト組織を変更する

は、私が持っている構造である。

root_dir 
    Makefile 
    main.cc 
    fileA.cc 
    fileA.h 
    fileB.cc 
    fileB.h 

またFILEBはFILEA(#include "fileA.h")から依存し、私のMakefileは次のようになります。

all: myExec 

myExec: main.o fileA.o fileB.o 
    g++ -Wall main.o fileA.o fileB.o -o myExec 

main.o: main.cc fileA.h fileB.h 
    g++ -Wall -c main.cc 

fileA.o: fileA.cc fileA.h 
    g++ -Wall -c fileA.cc 

fileB.o: fileB.cc fileB.h fileA.h 
    g++ -Wall -c fileB.cc 

今、私はそのような何かをしたいのですが:

root_dir 
    Makefile 
    main.cc 
    dirA 
    fileA.cc 
    fileA.h 
    dirB 
    fileB.cc 
    fileB.h 

私は、各サブディこれは、ファイルBがfileA(別のサブディレクトリにある)に依存しているため、ここで実行可能であるかどうかはわかりません。

サブディレクトリを含むようにメインのMakefileを変更する必要はありますか?

ありがとうございます。

+0

現在のMakefileはどのように機能しますか? – Quentin

+0

現実世界の例を提供する必要があります。 'fileB'は' fileA'にどのように依存しますか?このような詳細は非常に重要です。あなたが作っているもの、実行可能ファイルについても言及していませんか?ライブラリ? – user657267

+0

Makefileの説明を追加しました。 fileB include fileA(#include 'fileA.h')を記述しました。私は実行可能ファイルを作成しています。 – whiteShadow

答えて

0

1つのメイクファイルに固執すると、実際に行っていることとはそれほど違いはありません。単にインクルードフラグを正しく設定するだけです。あなたのmakefileは、makeの組み込みルールと、ヘッダを手動で追加する必要のないGCCの依存関係生成フラグによって、大幅に単純化することもできます。

N.b. main.ccmyExec.ccに変更すると、より直感的なIMOになり、リンクレシピをスキップできます。

srcs := $(wildcard dirA/*.cc dirB/*.cc) 
objs := $(srcs:.cc=.o) myExec.o 
deps := $(objs:.o=.d) 

CPPFLAGS := -MMD -MP 

myExec: CC := $(CXX) 
myExec: $(objs) 
myExec.o: CPPFLAGS += -IdirA -IdirB 
dirA/%.o: CPPFLAGS += -IdirB 

.PHONY: clean 
clean: ; $(RM) $(objs) $(deps) myExec 

-include $(deps) 

しかし、このような人工的な例では、プロジェクトを複数のディレクトリに分割することのメリットが分かりません。

+0

ありがとうございます。しかし、私はあなたのソリューションが読みにくいと感じています。また、それは私が与えた簡単な例だからかなりシンプルなままですが、現実には約10のサブディレクトリがあります。これはあなたのソリューションでmakefileを複雑にするでしょうか? – whiteShadow

+0

私はこのウェブサイトをmakefileの 'learn'に使用しました:http://mrbook.org/blog/tutorials/make/ – whiteShadow

+0

@whiteShadowそれらのディレクトリにある同じ実行可能ファイルのための他のソースファイルがあればそれは単純です'ワイルドカード'にdirを追加すると、makefileディレクトリをインクルード・ルートとして任意の速度で使用し、 '#include" dirB/fileB.h'などと考えるべきでしょう。別のincludeを指定する必要はありませんコンパイル時のディレクトリ – user657267

関連する問題