93005


### 質問内容

以下のmakefileですが以下のエラーが発生する原因がわかりません。  
一つのディレクトリの場合は成功するのですが２つある場合はどうすればいいのでしょうか？  
同じように依存のする場所に２つの変数を記述してコマンドを普通に記述すればいいだけだと思うのですがうまく行きません。

### 知りたこと

以下のコンソール画面のエラーの対象方法が知りたい

### 試したこと

参考サイトを参考に依存するファイルが２つディレクトリ分あるので $< を$^にしてすべての依存するファイルを指定

### 参考サイト

自動変数： <https://tex2e.github.io/blog/makefile/automatic-variables>  
依存関係の書き方部：
[https://www.unixuser.org/~euske/doc/makefile/](https://www.unixuser.org/%7Eeuske/doc/makefile/)

### ディレクトリ構造

[code]

    FrameWork/bin/program
    FrameWork/src/*.cpp
    FrameWork/src/*.hpp
    FrameWork/src/component/*.cpp
    FrameWork/src/component/*.hpp
    FrameWork/Makefile
    
[/code]

### コンソール

[code]

    $ sh run.sh
    make: *** 'bin/libFrameWork.a' に必要なターゲット 'obj/BoxCollider2D.o' を make するルールがありません.  中止.
    
        FrameWork Compile Error
    
[/code]

### Makefile

[code]

    PRG         :=bin/libFrameWork.a
    
    SRC_DIR                 :=src
    SRC_COMPONENT_DIR       :=src/component
    
    OBJ_DIR     :=obj
    DEP_DIR     :=obj
    DEP         :=$(wildcard $(DEP_DIR)/*.d)
    
    SRC             :=$(wildcard $(SRC_DIR)/*.cpp)
    SRC_COMPONENT   :=$(wildcard $(SRC_COMPONENT_DIR)/*.cpp)
    
    OBJ_COMPONENT   :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC_COMPONENT))))
    OBJ         :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC))))
    
    
    $(PRG): $(OBJ) $(OBJ_COMPONENT) 
    #   ar rcs $@ $(OBJ) $(OBJ_COMPONENT)
        ar rcs $@ $^
    
    $(OBJ_DIR)/%.o: src/%.cpp src/component/%.cpp
    #   $(CXX) -c -MMD -MP $<  -o $@ -I ~/Library -I ~/Library/freetype 
        $(CXX) -c -MMD -MP $^  -o $@ -I ~/Library -I ~/Library/freetype 
    -include $(DEP)
    
    clean:
        rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG)
    
[/code]


CC BY-SA 4.0
2022-12-25T02:35:22.107
92998
2022-12-26T01:42:17.377
2022-12-26T01:42:17.377
3060
55177
question
makefile
複数ディレクトリの依存関係をmakeする方法が知りたい


ルールの記述が間違っていると思います。  
具体的には、以下の箇所を2つのルールで記述すると良いと思います。

変更前:

[code]

    $(OBJ_DIR)/%.o: src/%.cpp src/component/%.cpp
        $(CXX) -c -MMD -MP $^  -o $@ -I ~/Library -I ~/Library/freetype
    
[/code]

変更後:

[code]

    $(OBJ_DIR)/%.o: src/%.cpp
        $(CXX) -c -MMD -MP $^  -o $@ -I ~/Library -I ~/Library/freetype
    
    $(OBJ_DIR)/%.o: src/component/%.cpp
        $(CXX) -c -MMD -MP $^  -o $@ -I ~/Library -I ~/Library/freetype
    
[/code]

* * *

変更前のルールだと、`obj/BoxCollider2D.o`に対して、次のように解釈されるようです。

[code]

    obj/BoxCollider2D.o: src/BoxCollider2D.cpp src/component/BoxCollider2D.cpp
     　 　$(CXX) -c -MMD -MP $^  -o $@ -I ~/Library -I ~/Library/freetype
    
[/code]

(どちらのディレクトリにあるソースファイルか質問からは読み取れませんので、`src`にあるものとして記載しますが)  
`src/BoxCollider2D.cpp`は存在するので問題ないですが、`src/component/BoxCollider2D.cpp`は存在しないため、`make`はこのファイルの生成を試みます。  
が、`src/component/BoxCollider2D.cpp`の生成ルールは存在しないため、結果として元のルールは適用されない、という状況のようです。

＃どのように動作しているかは、「`make -d`」と実行すると、出力されるので、  
思い通りに動作しない場合、それを見てみると良いと思います。


CC BY-SA 4.0
2022-12-25T11:29:24.603
93005
2022-12-25T11:29:24.603
20098
92998
answer