現在、適切なMakefileをビルドしようとしています。メイクファイルの改善、依存関係の生成が機能しない
私が欲しいのは、何が起こっているのかを完全にコントロールしているため、サードパーティのソフトウェアは必要ありません。
私の現在の試みは私にとって論理的だと思われますが、依存関係の生成は有効ではないので、私は固執しています。
読みやすさを向上させるために、完全なMakefileは小さな断片に分割されています。改善すべきことがあれば、どのセクションにもコメントしていただければ幸いです。すべての
まず、私は、この私の知る限り、以下の静的な定義
CXX = g++
CXXFLAGS = -Wall \
-Wextra \
-Wuninitialized \
-Wmissing-declarations \
-pedantic \
-O3 \
-p -g -pg
LDFLAGS = -p -g -pg
DEPFLAGS = -MM
は問題ないはずです。プロファイルフラグをオプションにすることは完璧ですが、それは重要ではありません。
SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_EXT = .cpp
OBJ_EXT = .o
TARGET = ./bin/my_target
SRCS = $(wildcard $(SRC_DIR)/*$(SRC_EXT))
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:$(SRC_EXT)=$(OBJ_EXT)))
DEP = depend.main
基本的に、これは単なるサブフォルダsrc
のうち、すべての*.cpp
ファイルを抽出し、さらにオブジェクトの名前として.o
で./obj
と.cpp
で./src
を置き換える必要があります。
.PHONY: clean all depend
all: $(TARGET)
$(TARGET): $(OBJS)
@echo "-> linking [email protected]"
@$(CXX) $^ $(LDFLAGS) -o [email protected]
$(OBJ_DIR)/%.$(EXT_OBJ):
@echo "-> compiling [email protected]"
@$(CXX) $(CXXFLAGS) -c $< -o [email protected]
Afaikこのブロックは、有効な依存ファイルが存在するため、必要なコンパイルとリンクをすべて行う必要があります。
clean:
@echo "removing objects and main file"
@rm -f $(OBJS) $(TARGET)
ここには何かが欠けていますか?
$(SRC_DIR)/%.$(SRC_EXT):
$(CXX) $(DEPFLAGS) -MT \
"$(subst $(SRC_DIR),$(OBJ_DIR),$(subst $(SRC_EXT),$(OBJ_EXT),[email protected]))" \
$(addprefix ,[email protected]) >> $(DEP);
clear_dependencies:
@echo "-> (re-)building dependencies";
@$(RM) $(DEP)
depend: clear_dependencies $(SRCS)
これは機能しない部分です。私が行うことは、g++
コンパイラフラグ-MM
を使用して依存関係を自動作成し、-MT
を使用してデフォルトのパスとは異なるパスを使用することです。 は、得られた依存関係が
./obj/main.o: ./src/main.cpp ./src/some_header_file.h
のようになります。残念ながら、これは呼び出されませんし、私はこれが事実である理由の知識が不足しています。 similar questionでは、ユーザーBetaは.Phony
を追加して喜んで一時的な解決策を提供しましたが、これは変更なしですべてのオブジェクトを再構築する副作用があります。
は最後に、ちょうど1行
-include $(DEP)
は、一度作成された依存関係ファイルを含めることがあります。
どの部分についてのヒントも提供する回答は大歓迎です。 私の質問は次のとおりです:どうすればよいでしょうか、あるいは「きれいにする」ことができます。なぜ依存関係の生成は機能しませんか?
Hmph!私は 'PHONY'のやり方はちょっと止まらないと言っていました。私たちは次の反復で依存関係をカバーします。あなたが他の意見を呼びたい場合は、罰金、しかし私はあなたにスリップホップのアドバイスを与えた人々に伝えていない。 – Beta
申し訳ありませんが、これは誤解です。私はあなたの答えを持ってうれしいですが、より詳細な質問を作りたいと思っていました。これはちょうど古いものを更新すれば面倒です。私はあなたの努力と答えに非常に感謝します。 – stefan