g++ glfwがリンクできない。


提示コンソール画面ですがライブラリリンクを行うと大量の未定というエラーが出ます。これはなぜでしょうか？
回答にある通りライブラリリンクのやり方を調べたのですがわかりません。  
また最小限の環境を再現して実行しましたがリンク出来ません。  
利用ライブラリ  
stb  
opengl  
glew  
glfw  
freetype

mingw32  
[![画像の説明をここに入力](https://i.stack.imgur.com/sfD2O.png)](https://i.stack.imgur.com/sfD2O.png)  
ソースコード: <https://www.dropbox.com/s/pa3z0ih18lfcqxt/AAEditor.zip?dl=0>

参考サイトC：https://www.glfw.org/docs/3.3/build_guide.html  
参考サイトA:  
<https://stackoverflow.com/questions/18475234/undefined-references-to-imp-
glew-functions-with-mingw-gcc>

参考サイトB：http://glew.sourceforge.net/install.html

##### 環境

windows 10 home  
VSCode

##### 入手先

glfw : <https://www.glfw.org/>  
glew : <http://glew.sourceforge.net/>

##### 調べたこと

int main()関数 Main.cppを追加  
追記： glew/lib/x64/ファイルのglew32.lib等にファイルを置き換えたら以下のコマンドエラーが変化しました。

glfwを再ダウンロードしてmingwというフォルダの中を提示画像のディレクトリに移動  
`$(CXX) $^ -o $@ -L/lib -lglfw3 -lopengl32`  
`$(CXX) $^ -o $@ -lglfw3dll -lopengl32`

最小コード: <https://www.glfw.org/documentation.html>  
だけでコンパイルをしてみましたが同じ未定義のエラーが出ます。

またgccでリンクが出来ない以下のURLを確認しましたが該当しませんでした。  
<https://teratail.com/questions/89964>

`int main(){printf("Hello
World");}`という単純なソースファイルをコンパイルして見ましたが通常通りコンパイルが通り実行して文字が表示されました。

という最小環境をにして試しましたが同じエラー出て未定義となります。  
コンパイルは通った。  
リンクする順番を入れ替えたりしたが同じ結果だった。  
インクルードライブラリを確認。  
参考サイトBより "GLEW_BUILDプリプロセッサ定数を GLEW_STATICに変更する必要もあります。そうしないと、ビルドエラーが発生します。"
文より

[code]

    #define GLEW_BUILD GLEW_STAIC
    #define GLEW_STAIC GLEW_BUILD
    
[/code]

を試しました。

参考サイトを参考に提示コードのように実装しましたが依然として同じエラーが大量に出ます。また日本語に訳して見ているのですがこの文章があいまいでわかりません。  
"Makefileにルールを追加して、このプリプロセッサトークンを定義します。#define ..." どういう意味なのでしょうか？

##### コマンドプロンプト(一部省略)

[code]

    > make
    g++ -MMD -MP -DGLEW_STATIC -IC:/glew-2.1.0/include -IC:/glfw-3.3.6/include -IC:/glm -IC:/stb -IC:/freetype-2.3.5-1/include -IC:/freetype-2.3.5-1/include/freetype2  -c source/Main.cpp -o object/Main.o
    g++ object/Window.o object/Help.o object/Simple.o object/Shader.o object/Model.o object/Actor.o object/Primitive_Shape.o object/Text.o object/Resource.o object/Init.o object/Main.o object/Camera.o object/Transform.o object/Sprite.o object/Shape.o object/Render.o -o test -LC:/glew-2.1.0/lib/Release/Win32 -LC:/glfw-3.3.6/lib-mingw -LC:/freetype-2.3.5-1/lib -lglew32s -lopengl32 -lglfw3 -lgdi32 -lfreetype
    c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: object/Window.o:Window.cpp:(.text+0x26a): undefined reference to `glfwTerminate'
    c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: object/Window.o:Window.cpp:(.text+0x2e9): undefined reference to `glfwMakeContextCurrent'
    
    //長いので省略
    
    collect2.exe: error: ld returned 1 exit status
    Makefile:14: recipe for target 'GL' failed
    make: *** [GL] Error 1
    
[/code]

##### Window.cpp (上部)

[code]

    #define GLEW_STATIC
    #ifdef GLEW_STATIC
    #  define GLEWAPI extern
    #else
    #  ifdef GLEW_BUILD
    #    define GLEWAPI extern __declspec(dllexport)
    #  else
    #    define GLEWAPI extern __declspec(dllimport)
    #  endif
    #endif
    
    
    #include "../header/Window.hpp"
    
    #include <iostream>
    #include <limits.h>
    #include <chrono>
    #include <thread>
    #include <time.h>
    #include <stdio.h>
    #include <wchar.h>
    
    //#include <GL/glew.h>
    #include <GLFW/glfw3.h>
    
    #include "../header/Window.hpp"
    #include "../header/Init.hpp"
    #include "../header/Window_use.hpp"
    #include <string>
    
    
    // ##################################### コンストラクタ ##################################### 
    FrameWork::Window::Window(GLFWwindow* win, glm::ivec2 s,const char* t)
    {
        //windowSize  = size;
        window = win;
        size = s;
        title = std::string(t);
        prevMouseVector = glm::dvec2(0,0);
    
[/code]

##### Makefile

[code]

    PRG         :=GL
    SRC_DIR     :=source
    INC_DIR     :=-IC:/glew-2.1.0/include -IC:/glfw-3.3.6/include -IC:/glm -IC:/stb -IC:/freetype-2.3.5-1/include -IC:/freetype-2.3.5-1/include/freetype2 
    LIB_DIR     :=-LC:/glew-2.1.0/lib/Release/Win32 -LC:/glfw-3.3.6/lib-mingw -LC:/freetype-2.3.5-1/lib
    LIB_LST     :=-lglew32s -lopengl32 -lglfw3 -lgdi32 -lfreetype 
    OBJ_DIR     :=object
    DEP_DIR     :=object
    DEP         :=$(wildcard $(DEP_DIR)/*.d)
    SRC         :=$(wildcard $(SRC_DIR)/*.cpp)
    OBJ         :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC))))
    CXXFLAGS    :=-MMD -MP -DGLEW_STATIC $(INC_DIR)
    
    $(PRG): $(OBJ)
        $(CXX) $^ -o $@ $(LIB_DIR) $(LIB_LST)
     
    
    $(OBJ_DIR)/%.o: source/%.cpp
        $(CXX) $(CXXFLAGS) -c $< -o $@
    -include $(DEP)
        
    clean:
        rm -f ./$(OBJ_DIR)/*.o ./$(OBJ_DIR)/*.d $(PRG)
        
    
[/code]




> エラーメッセージは同じです。

と言いつつ変わっていますよね。[リビジョン16](https://ja.stackoverflow.com/revisions/85592/16)では

>
[code]

>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Camera.o:Camera.cpp:(.text+0x81): undefined reference to
> `_imp____glewGenVertexArrays'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Camera.o:Camera.cpp:(.text+0x9c): undefined reference to
> `_imp____glewGenBuffers'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Camera.o:Camera.cpp:(.text+0x113): undefined reference to
> `_imp____glewBindVertexArray'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Camera.o:Camera.cpp:(.text+0x128): undefined reference to
> `_imp____glewBindBuffer'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Camera.o:Camera.cpp:(.text+0x145): undefined reference to
> `_imp____glewBufferData'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Camera.o:Camera.cpp:(.text+0x18e): undefined reference to
> `_imp____glewEnableVertexAttribArray'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Camera.o:Camera.cpp:(.text+0x1a0): undefined reference to
> `_imp____glewVertexAttribPointer'
>  
[/code]

とあり`_imp____glewGenVertexArrays`が要求されています。対して[リビジョン17](https://ja.stackoverflow.com/revisions/85592/17)では

>
[code]

>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Window.o:Window.cpp:(.text+0x51d): undefined reference to
> `glfwGetWindowUserPointer'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Window.o:Window.cpp:(.text+0x54d): undefined reference to
> `glfwGetWindowUserPointer'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Window.o:Window.cpp:(.text+0x5a1): undefined reference to
> `glfwGetFramebufferSize'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Window.o:Window.cpp:(.text+0x5d1): undefined reference to
> `glfwGetWindowUserPointer'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Window.o:Window.cpp:(.text+0x63f): undefined reference to
> `glfwGetWindowUserPointer'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Window.o:Window.cpp:(.text+0x6b0): undefined reference to
> `glfwGetWindowUserPointer'
>     c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
> object/Window.o:Window.cpp:(.text+0x74f): undefined reference to
> `glfwGetCursorPos'
>  
[/code]

とあり`glfwGetWindowUserPointer`が要求されています。

Windowsにおいて`.LIB`ファイルには２種類の形式が存在し、

  * static link library  
必要なコードはこのファイルに含まれていて実行ファイルが作成できる。

  * import library  
実行時に必要となるDLL名が含まれている。リンクに成功しても実行時にDLLが必要となる。

という違いがあります。  
`GLEW_STATIC`が登場していますが、GLEWに関してはコンパイル時に`GLEW_STATIC`を指定したら、前者static link
libraryの方の`.LIB`ファイルをリンカに渡す必要があります。逆に`GLEW_STATIC`を指定しない場合はたぶんimport
libraryの方の`.LIB`ファイルをリンカに渡す必要があります。

同様の問題がGLFWに必要であり、今`glfwGetWindowUserPointer`が要求されているということはstatic link
libraryの方の`.LIB`をリンカに渡す必要があります。もしくはGLFWの使用に従ってコンパイル時に何らかの指定を行い、import
libraryの方の`.LIB`ファイルを要求するようにコンパイルする必要があります。

入手元やバージョンの記載を求めたのも、どのように指定するべきかを確認するためです。

* * *

といった事情があり、

> -Lですがgccのlibフォルダに各ライブラリの.libをコピーしたので指定する必要がないはずなのですが。

この操作はまずいです。static link libraryが格納されているディレクトリやimport
libraryが格納されているディレクトリを`-L`で指定、切り替えできるようにするべきです。

それはそうと、質問者さんとしてはGLEWおよびGLFWについて、実行時にDLLを必要とするdynamic linkか、それとも必要としないstatic
linkか、どちらを求めているのでしょうか？  
（それがGLEW / GLFW、その他が双方をサポートするか、一方のみかはそれぞれのライブラリ次第ではありますが）

