2

私のC++プロジェクトには次の設定があります。

src フォルダーには *.cpp と対応する *.h ファイルがあり、obj フォルダーには .o ファイルが必要です。

これまでのところ、コンパイルとリンクは問題ではありません。しかし、今では手動で Makefile に入れるには .cpp と .h ファイルが多すぎます。そこで、makefile に次の小さな指示を書くことにしました。

collect_sources:
@echo "collecting source files";
@echo "SRCS = \\" > sources;
@for file in ./src/*.cpp; \
do \
    echo "$$file \\" >> sources; \
done

私もします

-include sources

メイクファイルの先頭に

結果のファイルsourcesは問題ないように見えますが、最終行に嫌いなバックスラッシュがあります。しかし、それは有害でもあるはずです。

また、依存関係を自動的に構築する必要もあります。*.cpp ファイルをSRCSMakefile で直接定義した最後のバージョンでは、次のコードが適切でした。

$(SRCDIR)/%.cpp:
  @$(CXX) $(DEPFLAGS) -MT \
  "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \
  $(addprefix ,$$file) >> $(DEP);
clear_dependencies:
    echo "" > $(DEP);

depend: clear_dependencies $(SRCS)

しかし、sources-file を含めると、上位のコード ブロックに到達することはありません。

Makefile の先頭で定義されている定数は次のとおりです。

CXX = g++
CXXFLAGS = -Wall \
       -Wextra \
       -Wuninitialized \
       -Wmissing-declarations \
       -pedantic \
       -O3 \
       -p -g -pg
LDFLAGS =  -p -g -pg
DEPFLAGS = -MM

SRCDIR  = ./src
OBJDIR  = ./obj

TARGET = ./bin/my_funky_function_which_is_not_the_real_name

-include sources

OBJSTMP =   $(SRCS:.cpp=.o)
OBJS        =   $(OBJSTMP:$(SRCDIR)=$(OBJDIR))
DEP = depend.main
EXT_SRC =   .cpp
EXT_OBJ =   .o

私は何が欠けていますか?私のアプローチは有効/実行可能ですか?

4

1 に答える 1

7

わかりました、あなたはそれを求めました。

1:あなたcollect_sources:... include sourcesは輝かしい Rube Goldberg ハッカーです。これを行うだけです:

SRCS = $(wildcard ./src/*.cpp)

目で確認したい場合は、次のようにします。

$(info $(SRCS))

2:

clear_dependencies:
    echo "" > $(DEP);

美学のために、これを修正しましょう。

clear_dependencies:
    $(RM) $(DEP);

3:

$(SRCDIR)/%.cpp:
    @$(CXX) $(DEPFLAGS) -MT \
  "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \
  $(addprefix ,$$file) >> $(DEP);

これには少し手間がかかります。まず差し迫った問題: ターゲットは存在する実際のファイルであり、ルールには前提条件がありません。したがって、ルールは実行されません (以前のバージョンでなぜ機能したのかわかりません。何かが異なっていた可能性があります)。一時的な修正として、静的パターン ルールと PHONY ターゲットに切り替えることをお勧めします。

.PHONY:$(SRCS)
$(SRCS) : $(SRCDIR)/%.cpp:
    @$(CXX) $(DEPFLAGS) -MT \
   ...

それがすべて機能するかどうかを確認してから、大きな問題に取り組むことができます.

于 2012-05-04T17:05:48.983 に答える