伝統的な方法は Makefile
を持つことです 各サブディレクトリ (part1
、 part2
など) 独立してビルドできます。さらに、 Makefile
を持っています すべてをビルドするプロジェクトのルート ディレクトリ。 「ルート」 Makefile
次のようになります:
all:
+$(MAKE) -C part1
+$(MAKE) -C part2
+$(MAKE) -C part3
make ターゲットの各行は独自のシェルで実行されるため、ディレクトリ ツリーをさかのぼったり、他のディレクトリに戻ったりすることを心配する必要はありません。
GNU make マニュアルのセクション 5.7 を参照することをお勧めします。とても役に立ちます。
他のディレクトリにある必要な cpp ファイルをコンパイルするために、ルート Makefile にルールを追加できます。以下の Makefile の例は、目的の場所に到達するための良い出発点となるはずです。
CC=g++ TARGET=cppTest OTHERDIR=../../someotherpath/in/project/src SOURCE = cppTest.cpp SOURCE = $(OTHERDIR)/file.cpp ## End sources definition INCLUDE = -I./ $(AN_INCLUDE_DIR) INCLUDE = -I.$(OTHERDIR)/../inc ## end more includes VPATH=$(OTHERDIR) OBJ=$(join $(addsuffix ../obj/, $(dir $(SOURCE))), $(notdir $(SOURCE:.cpp=.o))) ## Fix dependency destination to be ../.dep relative to the src dir DEPENDS=$(join $(addsuffix ../.dep/, $(dir $(SOURCE))), $(notdir $(SOURCE:.cpp=.d))) ## Default rule executed all: $(TARGET) @true ## Clean Rule clean: @-rm -f $(TARGET) $(OBJ) $(DEPENDS) ## Rule for making the actual target $(TARGET): $(OBJ) @echo "=============" @echo "Linking the target [email protected]" @echo "=============" @$(CC) $(CFLAGS) -o [email protected] $^ $(LIBS) @echo -- Link finished -- ## Generic compilation rule %.o : %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo "Compiling $<" @$(CC) $(CFLAGS) -c $< -o [email protected] ## Rules for object files from cpp files ## Object file for each file is put in obj directory ## one level up from the actual source directory. ../obj/%.o : %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo "Compiling $<" @$(CC) $(CFLAGS) -c $< -o [email protected] # Rule for "other directory" You will need one per "other" dir $(OTHERDIR)/../obj/%.o : %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo "Compiling $<" @$(CC) $(CFLAGS) -c $< -o [email protected] ## Make dependancy rules ../.dep/%.d: %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo Building dependencies file for $*.o @$(SHELL) -ec '$(CC) -M $(CFLAGS) $< | sed "s^$*.o^../obj/$*.o^" > [email protected]' ## Dependency rule for "other" directory $(OTHERDIR)/../.dep/%.d: %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo Building dependencies file for $*.o @$(SHELL) -ec '$(CC) -M $(CFLAGS) $< | sed "s^$*.o^$(OTHERDIR)/../obj/$*.o^" > [email protected]' ## Include the dependency files -include $(DEPENDS)
ソースコードを検索するディレクトリを make に指示する VPATH オプションが役立つ場合があります。ただし、インクルード パスごとに -I オプションが必要です。例:
CXXFLAGS=-Ipart1/inc -Ipart2/inc -Ipart3/inc
VPATH=part1/src:part2/src:part3/src
OutputExecutable: part1api.o part2api.o part3api.o
これにより、VPATH で指定されたディレクトリのいずれかで一致する partXapi.cpp ファイルが自動的に検索され、それらがコンパイルされます。ただし、これは、src ディレクトリがサブディレクトリに分割されている場合により便利です。他の人が言ったように、あなたが説明したことについては、特に各部分が独立している場合は、各部分のメイクファイルを使用する方がおそらく良いでしょう.
あるサブディレクトリのコードが別のサブディレクトリのコードに依存している場合は、トップレベルで単一の makefile を使用する方がよいでしょう。
完全な根拠については Recursive Make Considered Harmful を参照してください。ただし、基本的には、ファイルを再構築する必要があるかどうかを判断するために必要な完全な情報を make に持たせたいと考えています。あなたのプロジェクト。
上のリンクにアクセスできないようです。同じドキュメントにアクセスできます:
- aegis.sourceforge.net (アーカイブ)
- lcgapp.cern.ch