伝統的な方法は 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