94523
##### 質問内容

以下のコンソールログですがエラー[undefined reference to]の原因が知りたいです  
以下のように確認しましたがShaderクラスは含まれていますし実際にソースファイル、ヘッダーファイルが存在します。  
libFrameWork.aの場所はこのmakeファイルの実行場所から見て`../build/lib/libFrameWork.a`です。

##### 確認したこと

1,提示のコンソールログのように実際にライブラリに含まれているかを確認  
2,リンクする順序を確認  
3,chatGPTで質問  
4,Shaderクラスはソースファイル、ヘッダーファイルともに存在します。記述しています

##### 利用ライブラリ

opengl  
glfw  
glew

##### ライブラリ側のmakefile

```

    CXX=g++
    CXXFLAGS= -O3
    LDFLAGS= -L/lib/x86_64-linux-gnu -lglfw -lGLEW -lGL 
    
    
    SRCDIR=./src
    BINDIR=./build/obj
    DEPDIR=./build/obj
    LIBDIR=./build/lib
    
    ALL_SRC_DIR=$(shell find $(SRCDIR) -type d)
    ALL_SRC=$(foreach dir,$(ALL_SRC_DIR),$(wildcard $(dir)/*.cpp))
    ALL_OBJ=$(addprefix $(BINDIR)/, $(notdir $(ALL_SRC:.cpp=.o)))
    
    TARGET=$(LIBDIR)/libFrameWork.a
    
    all: $(TARGET)
    
    $(TARGET): $(ALL_OBJ)
        ar rcs $@ $^
    
    $(BINDIR)/%.o: $(ALL_SRC)
        $(CXX) $(CXXFLAGS) -c -MMD -MP $< -o $@ $(LDFLAGS)
    -include $(DEP)
    
    
    clean:
        rm -rf $(BINDIR)/* $(TARGET)
    
    
```

##### 利用側のmakefile

```

    CXX=g++
    CXXFLAGS= -O3
    LDFLAGS=-L../build/lib -lFrameWork -L/usr/local/lib -lglfw -lGLEW -lGL
    
    
    SRCDIR=./src
    BINDIR=./build/obj
    DEPDIR=./build/obj
    EXEDIR=./build/bin
    ALL_SRC_DIR=$(shell find $(SRCDIR) -type d)
    ALL_SRC=$(foreach dir,$(ALL_SRC_DIR),$(wildcard $(dir)/*.cpp))
    
    ALL_OBJ=$(addprefix $(BINDIR)/, $(notdir $(ALL_SRC:.cpp=.o)))
    ALL_OBJ:=./build/obj/Main.o
    ALL_SRC:=./src/Main.cpp
    
    TARGET=$(EXEDIR)/Game
    
    all: $(TARGET)
    
    $(TARGET): $(ALL_OBJ)
        $(CXX) $^ -o $@ $(LDFLAGS)
    
    $(BINDIR)/%.o: $(ALL_SRC)
        $(CXX) $(CXXFLAGS) -c -MMD -MP $< -o $@ $(LDFLAGS)
    -include $(DEP)
    
    
    clean:
        rm -rf $(BINDIR)/* $(TARGET)
    
    
    
```

##### コンソールログ

```

    :~/dev/FrameWork/$ make
    ./build/obj/WindowContext.o ./build/obj/Shader.o
    g++ -O3 -c -MMD -MP src/systems/WindowContext.cpp -o build/obj/WindowContext.o -L/lib/x86_64-linux-gnu -lglfw -lGLEW -lGL 
    g++ -O3 -c -MMD -MP src/systems/WindowContext.cpp -o build/obj/Shader.o -L/lib/x86_64-linux-gnu -lglfw -lGLEW -lGL 
    ar rcs build/lib/libFrameWork.a build/obj/WindowContext.o build/obj/Shader.o
    
```

で成功してます。

```

    :~/dev/FrameWork/examples$ cd ../
    :~/dev/FrameWork$ nm -gC build/lib/libFrameWork.a | grep Shader
    Shader.o:
    :~/dev/FrameWork$ cd examples
    :~/dev/FrameWork/examples$ nm -gC build/obj/Main.o | grep Shader
                     U FrameWork::Shader::Shader(unsigned int)
                     U FrameWork::Shader::~Shader()
    :~/dev/FrameWork/examples$ make
    g++ build/obj/Main.o -o build/bin/Game -L../build/lib -lFrameWork -L/usr/local/lib -lglfw -lGLEW -lGL
    /usr/bin/ld: build/obj/Main.o: in function `main':
    Main.cpp:(.text.startup+0x24): undefined reference to `FrameWork::Shader::Shader(unsigned int)'
    /usr/bin/ld: Main.cpp:(.text.startup+0x2c): undefined reference to `FrameWork::Shader::~Shader()'
    collect2: error: ld returned 1 exit status
    make: *** [Makefile:22: build/bin/Game] エラー 1
    
    
```

##### Main.cpp

```

    #include <iostream>
    #include "../../include/framework/FrameWork.hpp"
    
    int main()
    {
        FrameWork::Shader shader(0);
        return 0;
    }
    
```

##### "../../include/framework/FrameWork.hpp"

```

    #include "./systems/WindowContext.hpp"
    #include "./utils/Shader.hpp"
    
```
CC BY-SA 4.0
2023-04-13T09:16:32.033
94505
2023-04-14T23:03:29.500
2023-04-14T11:13:20.007
55177
55177
question
opengl makefile
g++ ライブラリリンク エラー[undefined reference to]の原因が知りたい 自作ライブラリ
前の質問 [makefile「'〇〇.a' に必要なターゲット '〇〇.o' を make するルールがありません. 」の原因が知りたい
の間違った対処](https://ja.stackoverflow.com/a/94503/3475)が原因で、Shader.cpp
のコンパイル結果がライブラリに含まれていないと思われます。Shader.cpp を編集して make して、実行されるコマンドをよく見てみましょう。

Makefile をもとに戻し、前の質問をちゃんと解決しましょう。
CC BY-SA 4.0
2023-04-13T12:21:34.680
94507
2023-04-13T12:27:13.370
2023-04-13T12:27:13.370
3475
3475
94505
answer
(int32_tさんの回答で十分なのですが、まだ理解していないようなので、補足です。)

> で成功してます。

いいえ、そのコンパイルの内容は正しくはなく、 **失敗** しています。エラーが出ないから成功ではありません。
**意図したとおりのコンパイルが正常に終了すること** が成功です。

>
```

>     g++ -O3 -c -MMD -MP src/systems/WindowContext.cpp -o build/obj/Shader.o
> -L/lib/x86_64-linux-gnu -lglfw -lGLEW -lGL
>  
```

上記コマンドの意味を言葉で説明できますか？いろいろオプションはついていますが、 "src/systems/WindowContext.cpp"
をg++でコンパイルしてオブジェクトファイルを "build/obj/Shader.o"
として出力するという意味です。そうです。コンパイルしている対象のソースファイルは "src/systems/WindowContext.cpp"
です。もう一度言います。  
**" src/systems/WindowContext.cpp" をコンパイルして、その結果が "build/obj/Shader.o" です。**

本当にコンパイルして "build/obj/Shader.o" にしたかったのは、 "src/utils/Shader.cpp" ですよね？
`FrameWork::Shader` は "src/utils/Shader.cpp"
にありますよね？でも、それとは違うソースをコンパイルしているので、その結果作られる libFrameWork.a に `FrameWork::Shader`
が含まれるわけがありません。

なお、 `nm -gC build/lib/libFrameWork.a | grep Shader` で `FrameWork::Shader`
が含まれているか確認しているようですが、正しくコンパイルが **成功**
しているのであれば、`FrameWork::Shader::Shader(unsigned
int)`等のコンストラクタも表示されるはずです。それが無い時点で、 libFrameWork.a がおかしいということに気付くことができます。

* * *

コマンドを実行して、エラーが無ければ成功なのではありません。そのコマンドが「どんな意味なのか？」「何をする物なのか？」「どのような結果になれば良いのか？」をきちんと把握する必要があります。それができていなければ、どこで失敗しているかを気付くことはできません。

「原因が知りたい」という前に、実行しているコマンド一つ一つについて自分で説明してみてください。もし、自分が実行しているコマンドが「何をしているのかわからない」というのであれば、それこそ、それを質問してみてください。闇雲に推測のみで進んでも、グルグル同じ場所を回っているだけで、意味がありません。
CC BY-SA 4.0
2023-04-14T13:39:42.317
94523
2023-04-14T23:03:29.500
2023-04-14T23:03:29.500
7347
7347
94505
answer