M1 mac의 c++로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
콘파일・実行成功
❯ 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.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 우
Reference
이 문제에 관하여(M1 mac의 c++로GLFW를 사용하는), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/web3ten0/m1-macnocdeglfwwoshi-tutemiru-c6k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)