私のオブジェクト指向プログラミング コースでは、最終プロジェクト (学術目的) を行わなければなりません。クラス、makefile、および C++ をよりよく理解するために、プロジェクトを「正しい方法」(つまり、makefile、モジュラー、DRY、簡単にスケーラブルなど) にしたいと考えています。
私が得たアイデアは、「ツリーソースファイル構造ディレクトリ」を作成することです。そのため、各サブフォルダーに、ヘッダー、テストファイル、および単一のメイクファイルを含むソースファイルを取得しました。インターフェイスで作業したい場合は、サブフォルダー インターフェイスに移動し、ファイルを編集し、テストを実行します。すべて問題なければ、ルート ディレクトリでオブジェクトをリンクするだけです。データ構造に取り組みたい場合も同じです。優れた機能は、すべてのサブフォルダーにソース コードとオブジェクト ファイルが存在することです。したがって、ルート ディレクトリのリンカーは、サブフォルダーで既にコンパイルされているオブジェクト ファイルを検索し、それらをリンクします。
私はインターネットで検索してきましたが、さまざまな解決策を見つけることができました。
SUBDIRS=eda
.PHONY: subdirs $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
私が見つけた問題は、「eda」フォルダーの前提条件が「変わった」ものになることです
-自動変数$(@D) を使用していますが、その仕組みがよくわかりませんでした - ワイルドカード機能を使用している可能性がありますが、このオプションについて少し混乱しています。
とにかく、私にとって最も魅力的な解決策は最初のもの (make を再帰的に使用する) でしたが、 make を再帰的に使用することは推奨されないという多くのコメントを見つけました興味深い記事
そこで皆さんにアドバイスをお願いしたいのですが、目的を達成し、すべての重要なモジュールを別のフォルダーに入れるにはどうすればよいでしょうか? 再帰は最善の解決策ですか?たぶん、「automake」に飛び込む必要がありますか?それとも、すべてのオブジェクト ファイルをルート ディレクトリの新しい「オブジェクト」サブフォルダに移動し、それらをリンクする方がよいでしょうか?
ところで、私は Amarok のソース コードを盗聴して、このツリー構造のプロジェクトを作成することに着想を得ました。「src」というサブフォルダーがあり、そこに入ると、イコライザー、プレイリスト、ダイナミックなど、多くのサブフォルダーが表示されます。 、statusbar、core、playlistgenerator、playlistmanager など。そして、多くのサブフォルダーには独自のサブディレクトリがあります。その結果、すばらしい音楽プレーヤーができあがります。この方法が Amarok チームにうまく機能するなら... 私も似たようなことができるかもしれません!
コメント、フィードバック、提案などは大歓迎です。よろしくお願いします。
編集#1
Beta、いくつかの暗黙のルール (サフィックス) と、edaフォルダーにオブジェクトを必要とするリンカーのターゲットがあります。このターゲットの他のすべての前提条件は、現在のフォルダーに基づいて構築されます。私が抱えている問題は、そのターゲットをビルドするためにmakeを実行すると、「eda」フォルダーの前提条件の名前が、暗黙のルールでビルドするターゲットとして使用されることです。これは、私のプロジェクトでの再帰的な makefile のトリッキーで不潔な部分です。make がサブフォルダーを検索する必要があるすべてのオブジェクト ファイルに対して、特別な暗黙のルールを作成する必要があると思います。
だからこそ、私はいくつかのフィードバックが欲しいのです: ¿ それとも、私のプロジェクトで make recursive を使用する利点が他の選択肢を圧倒しますか?
とにかく、理解が深まれば、ここに私のドラフト Makefileがあります(spnish-english :P )
#Makefile hecho para las pruebas de los archivos dentro de esta carpeta
FLAGS=-g -DDEBUG
OUT_TI=TIndividuo
OUT_TP=TProfesor
OUT_TA=TAula
.SUFFIXES: .cpp .c .h .o
.c.o: ; cc $(FLAGS) -c $*.c
.cc.o: ; gcc $(FLAGS) -c $*.cc
.cpp.o: ; g++ $(FLAGS) -c $*.cpp
SUBDIRS=eda
.PHONY: subdirs $(SUBDIRS)
$(OUT_TI): eda/TAula.o CandidatoHorario.o TIndividuo.o TIndividuoTest.o TGen.o
g++ CandidatoHorario.o TIndividuo.o TIndividuoTest.o TGen.o eda/TAula.o -o $@
CandidatoHorario.o: CandidatoHorario.cpp CandidatoHorario.h
TIndividuoTest.o: TIndividuoTest.cpp TIndividuo.h
TIndividuo.o: TIndividuo.cpp TIndividuo.h
TGen.o: TGen.cpp
#eda/TAula.o: eda/TAula.cpp eda/TAula.h
# g++ -c eda/TAula.cpp -o $@
$(SUBDIRS):
$(MAKE) -C $@
clean:
rm -f *.o $(OUT_TI) $(OUT_TA) eda/TAula.o