콤퓨우터/Mac

macOS에서 OpenGL GLEW, GLUT을 사용한 프로그램의 컴파일

파란화면 2023. 10. 17. 21:54
반응형

Apple은 2018년 발표된 macOS 10.14 (Mojave)부터 OpenGL 지원을 Deprecated 처리했습니다. 하지만, 아무리 하위호환의 무덤이라는 Apple이라도 십수 년간 사용되어 왔던 OpenGL의 유산들을 다 버리고 갈 수는 없었기 때문에, OpenGL 지원은 레거시 Intel (AMD64) Mac 플랫폼은 물론 Apple Silicon (M1, M2) Mac에서도 아직까지는 계속되고 있습니다.

그래서 오늘은 Visual Studio로 작성된, cpp 코드 2개짜리 프로그램으로 GLEW, GLUT가 사용된 OpenGL 프로그램을 macOS + Xcode Command Line Tools 환경에서 (Xcode를 사용하지 않고) 컴파일해서 돌려보도록 하겠습니다.

환경: M1 에어, macOS Ventura 13.6

1. GLEW 설치

GLUT은 Mac OS X의 OpenGL에는 이미 포함되어 있기 때문에, 그냥 GLEW만 설치합니다. Homebrew가 설치된 Mac에서, brew install glew 명령어로 깔아줍니다.

2. GLEW 설치경로 확인

% brew info glew
==> glew: stable 2.2.0 (bottled), HEAD
OpenGL Extension Wrangler Library
https://glew.sourceforge.net/
/opt/homebrew/Cellar/glew/2.2.0_1 (38 files, 3.7MB) *
  Poured from bottle using the formulae.brew.sh API on 2023-10-17 at 14:26:55
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/g/glew.rb
License: BSD-3-Clause
==> Dependencies
Build: cmake ✘
==> Options
--HEAD
	Install HEAD version
==> Analytics
install: 2,019 (30 days), 6,052 (90 days), 16,505 (365 days)
install-on-request: 772 (30 days), 2,586 (90 days), 6,215 (365 days)
build-error: 0 (30 days)

/opt/homebrew/Cellar/glew/2.2.0_1 에 설치되었네요.

 

3. 헤더 바꿔주기

원래 코드의 헤더는 다음과 같았는데요,

#include "GL/glew.h"
#include "GL/freeglut.h"
#include "GL/freeglut_ext.h"

이걸 다음과 같이 바꿔줍니다.

#ifdef __APPLE__ 
#define GL_SILENCE_DEPRECATION
#include <GL/glew.h>
#include <GLUT/glut.h>

#else
#include "GL/glew.h"
#include "GL/freeglut.h"
#include "GL/freeglut_ext.h"
#endif  // __APPLE__

#define GL_SILENCE_DEPRECATION은 선택사항으로 필수사항은 아니지만, 이걸 넣으면 컴파일러가 귀찮게 deprecation 워닝을 띄우지 않게 됩니다.

4. 코드 바꿔주기

macOS에 내장된 GLUT의 동작이 FreeGLUT과 조금 다르기 때문에 glutInit() 부분을 조금 바꿔줘야 합니다.

원본 코드:

glutInit(&argc, argv);
glutInitWindowSize(512, 512);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitContextVersion(3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);

수정한 코드:

glutInit(&argc, argv);

#ifdef __APPLE__ 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_3_2_CORE_PROFILE);	
#else
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitContextVersion(3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);
#endif
glutInitWindowSize(512, 512);

이러면 OpenGL 3.2 Core Profile... 이 아니라 OpenGL 4.1 Core Profile으로 구동할 수 있게 됩니다.

5. Makefile

cpp 코드 2개짜리의 작은 프로그램이기 때문에 Makefile을 안 만들어도 충분히 컴파일하는데 문제는 없을 것입니다.

g++* 명령어:
(소스 파일이 src/cube.cpp, src/InitShader.cpp 의 2개라고 가정할 때)

g++ -Wall -Wextra -std=c++11 -I/opt/homebrew/Cellar/glew/2.2.0_1/include -o cube src/cube.cpp src/InitShader.cpp -L/opt/homebrew/Cellar/glew/2.2.0_1/lib -framework GLUT -framework OpenGL -lGLEW

(* 사실은 진짜 g++이 아니라 Xcode의 Apple LLVM/Clang입니다)
(** "/opt/homebrew/Cellar/glew/2.2.0_1" 부분에는 2번에서 찾은 경로를 써주세요)

하지만 기왕이니 Makefile을 만듭시다.

INCLUDES = -I/opt/homebrew/Cellar/glew/2.2.0_1/include
LIBPATHS = -L/opt/homebrew/Cellar/glew/2.2.0_1/lib
CC = g++
CFLAGS = -Wall -Wextra -std=c++11 $(INCLUDES)
LIBS = $(LIBPATHS) -framework GLUT -framework OpenGL -lGLEW

SRCS = src/cube.cpp src/InitShader.cpp

TARGET = cube

all: $(TARGET)

$(TARGET): $(SRCS)
	$(CC) $(CFLAGS) -o $(TARGET) $(SRCS) $(LIBS)

clean:
	rm -f $(TARGET)

이제 터미널에서 make를 해 주면 바이너리가 만들어집니다.

반응형