2016-11-12 13 views
0

サブディレクトリを持つプロジェクトのmakefileに問題があります。 プロジェクトのディレクトリツリーは以下である:Makefileサブディレクトリ再帰

project 
├── Makefile 
├── main.cpp 
| 
├── lib1 
│ ├── lib1.cpp 
│   ├── lib1.h 
│   └── Makefile 
| 
├── lib2 
│   ├── Makefile 
│   ├── lib2_1.cpp 
│   ├── lib2_1.h 
| ├── lib2_2.cpp 
│   └── lib2_2.h 
| 
├── lib3 
│   ├── Makefile 
│   ├── lib3.cpp 
│   └── lib3.h 

各サブディレクトリのメイクファイル(LIB1、LIB2 ...)は、このようなものです:

SRC_DIR = ./ 
BUILD_DIR = ./obj/ 

DEPS = lib1.o 

all: $(BUILD_DIR)$(DEPS) 

$(BUILD_DIR)%.o: $(SRC_DIR)%.cpp $(SRC_DIR)%.h 
    mkdir -p $(BUILD_DIR) 
    g++ --std=c++11 $< -c -o [email protected] 

clean: 
    rm -fr $(BUILD_DIR) 

私の問題は、次のとおりです。私はメイクを作成するにはどうすればよいですプロジェクトディレクトリにあるファイル、またはmakefile "root"? サブディレクトリ内のmakefileを再帰的に実行し、各サブディレクトリのobjフォルダにあるすべてのオブジェクトファイルをリンクするmakefileを作成できません。

私を助けることができますか?してください

+0

あなたの問題を解決できないコメントだけ。それともそれは? ;)IMHO、各サブディレクトリにはlib1.oターゲットではなくアーカイブ/ soターゲットが必要です。 –

+0

なぜ各サブディレクトリにはそのようなターゲットが必要ですか? –

+0

archive/so、1つ選んでください。ビルドしようとしているものはわかりませんが、あなたのディレクトリはlib [123]という名前になっていますので、私はあなたがライブラリを構築していると仮定します。 –

答えて

0

私はこのようにそれを行うだろう:

SUBDIRS = lib1 lib2 lib3 

main: main.cpp $(SUBDIRS) 
     $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $< $(wildcard $(addsuffix /obj/*.o,$(SUBDIRS))) $(LDLIBS) 

.PHONY: $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] 

このことについて良いこと:パラレルビルドのために、それはmake -jNで正しく動作しますし、あなただけの1つのサブディレクトリを構築したい場合は、などmake lib1を実行することができます。

悪いこと:makeを実行するたびに、何も変更されていない場合でもmainプログラムが再リンクされます。

悪いことを避けたい場合は、非再帰的なmakefileの使用を検討してください。これは、makefileを幾分書き直す必要があります。

すべてのオブジェクトファイル自体をリンクするのではなく、ディレクトリ(したがって、liblib1.aなど)にちなんで命名された各サブディレクトリに対して1つの静的ライブラリを作成したい場合は、おそらく再帰的なmakefileで動作させることができます。そのトリックは、ルートmakefileがライブラリの名前を単独で推論したり、計算したりできなければならないということです。それらを見つけるのにwildcardなどを使用することはできません。

+0

ありがとう、素晴らしい仕事! –

関連する問題