1. ホーム
  2. c++

[解決済み] src/ にあるすべての .cpp ファイルを obj/ にある .o にコンパイルし、./ にあるバイナリにリンクすることは可能ですか?

2022-07-28 23:40:31

質問

私のプロジェクトディレクトリはこのようになっています。

/project
    Makefile
    main
    /src
        main.cpp
        foo.cpp
        foo.h
        bar.cpp
        bar.h
    /obj
        main.o
        foo.o
        bar.o

makefile にやってもらいたいことは、すべての .cpp ファイルをコンパイルします。 /src フォルダーから .o のファイルを /obj フォルダを作成し、すべての .o のファイルを /obj のファイルを、トップレベルフォルダの出力バイナリにコピーします。 /project .

私は Makefile の経験がほとんどなく、これを達成するために何を検索すればよいのかよくわかりません。

また、これはこれを行うための "良い"方法ですか、それとも私がやろうとしていることにもっと標準的なアプローチがあるのでしょうか。

どのように解決するのですか?

質問のMakefile部分

一般化する必要がないのであれば、これはとても簡単です。 以下のコードのようなものを試してみてください(ただし、g++の近くではスペースインデントをタブに置き換えてください)。

SRC_DIR := .../src
OBJ_DIR := .../obj
SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))
LDFLAGS := ...
CPPFLAGS := ...
CXXFLAGS := ...

main.exe: $(OBJ_FILES)
   g++ $(LDFLAGS) -o $@ $^

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
   g++ $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<


依存関係グラフの自動生成

ほとんどのmakeシステムにとってquot;must"な機能です。GCC では、コンパイルの副次的な効果として、1 パスで -MMD フラグを CXXFLAGS -include $(OBJ_FILES:.o=.d) をmakefile本体の末尾に追加してください。

CXXFLAGS += -MMD
-include $(OBJ_FILES:.o=.d)

また、すでに述べたように、常に GNU Make マニュアル を持ち歩いていると、とても役に立ちます。