M1 Попытка использовать GLFW с c++ на mac

Я еще ничего не знаю об OpenGL, но хочу использовать GLFW для отображения анимации. На данный момент я отобразил окно в c++ на M1 mac.

Окружающая среда

> 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);
Войдите в полноэкранный режим Выход из полноэкранного режима

Попытайтесь скрыть предупреждения

  • Добавьте следующее в ваш код
#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.json в vimspector следующим образом, но получаю ошибку.
{
  "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


Отображаемое окно

Оцените статью
devanswers.ru
Добавить комментарий