M1 mac의 c++로GLFW를 사용하는

15063 단어 openglguicppglfw
OpenGL을 사용하기 위해서는 모든 것을 나누거나, GLFW를 사용하기 위해 애니메이션을 사용하기를 원합니다.

環境




> uname -m
arm64
> brew config
macOS: 12.5-arm64
Rosetta 2: false



GLFWを인스톨




> brew install glfw
> brew --prefix glfw
/opt/homebrew/opt/glfw



콘파일・実行してみるコード



  • ここの예제 코드



  • 인스톨시타이다だけだとエラーになる




    ❯ g++ -o main main.cpp -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
    main.cpp:1:10: fatal error: 'GLFW/glfw3.h' file not found
    #include <GLFW/glfw3.h>
    



    CPATH, LIBRARY_PATH(을)를 사용하려면




    > vim ~/.zshrc
    # 下記を追加
    export CPATH=/opt/homebrew/include
    export LIBRARY_PATH=/opt/homebrew/lib
    



    콘파일・実行成功


  • コンれはAppleがOpenGLを基本廃止(非推奨)にしているかららしい.

  • ❯ g++ -o main main.cpp -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
    main.cpp:23:5: warning: 'glClear' is deprecated: first deprecated in macOS 10.14 - OpenGL API deprecated. (Define GL_SILENCE_DEPRECATION to silence these warnings) [-Wdeprecated-declarations]
        glClear(GL_COLOR_BUFFER_BIT);
        ^
    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:2394:13: note: 'glClear' has been explicitly marked deprecated here
    extern void glClear (GLbitfield mask) OPENGL_DEPRECATED(10.0, 10.14);
    



    경고を非表示にしてみる


  • コードに下記を追加する.
  • #define GL_SILENCE_DEPRECATIONによって, 非表示になる.


  • #ifdef __APPLE__
    #define GL_SILENCE_DEPRECATION
    #include <GLFW/glfw3.h>
    #endif
    



    Makefileを作る




    CPPFLAGS := -I src/includes
    FRAMEWORKS := -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
    LIBS := -lglfw
    
    BUILD_DIR := ./bin
    SRC_DIRS := ./src
    SRCS := $(shell find $(SRC_DIRS) -name *.cpp)
    OBJS := $(addprefix $(BUILD_DIR)/, $(subst .cpp,.o, $(notdir $(SRCS))))
    
    $(BUILD_DIR)/main: $(OBJS)
        clang++ -o $@ $(LIBS) $(FRAMEWORKS) $^ 
    $(BUILD_DIR)/%.o: src/%.cpp
        clang++ -c -o $@ $(CPPFLAGS) $<
    
    do:
        @bin/main
    clean:
        rm -rf bin
        mkdir bin
    
    



    디버그하기


  • vimspector에서 .vimspector.jsonを下記のように設定してみたけど, エラーになる.
  • -lglfwがあるとエラーになるっぽい.

  • {
      "configurations": {
        "CodeLLDB": {
          "adapter": "CodeLLDB",
          "variables": {
            "BUILDME": {
              "shell": "clang++ -o ${workspaceRoot}/bin/debug -g -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo ${workspaceRoot}/src/main.cpp"
            }
          },
          "configuration": {
            "request": "launch",
            "program": "${workspaceRoot}/bin/debug",
            "stdio": [null, null, null]
          }
        }
      }
    }
    
    



    青いウインドウを表示する코드




    #ifdef __APPLE__
    #define GL_SILENCE_DEPRECATION
    #include <GLFW/glfw3.h>
    #endif
    
    #include <iostream>
    using namespace std;
    
    static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
      if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GLFW_TRUE);
    }
    
    int main(void) {
      GLFWwindow* window;
      if (!glfwInit()) return -1;
    
      glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
      glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
      glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
      glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    
      window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
      if (!window) {
        cout << "failed to create window." << endl;
        glfwTerminate();
        return -1;
      }
      cout << "opened window" << endl;
      glfwSetKeyCallback(window, key_callback);
      glfwMakeContextCurrent(window);
      glfwSwapInterval(1);
    
      const GLubyte* renderer = glGetString(GL_RENDERER);
      const GLubyte* version = glGetString(GL_VERSION);
      std::cout << "Renderer: " << renderer << std::endl;
      std::cout << "OpenGL version supported: " << version << std::endl;
    
      glClearColor(0.0f, 0.3f, 0.6f, 0.3f);
    
      while (!glfwWindowShouldClose(window)) {
        glClear(GL_COLOR_BUFFER_BIT);
        glfwSwapBuffers(window);
        glfwPollEvents();
      }
    
      glfwTerminate();
      cout << "closed window" << endl;
    }
    



    리포지트리



    https://github.com/web3ten0/cpp-glfw-1


    表示されるWINDOW 우



    좋은 웹페이지 즐겨찾기