-
[C++/Modern OpenGL] 2. OpenGL 개발 환경 세팅하기학부의 잔재 2024. 9. 11. 12:31반응형
2-2. GLEW 세팅
GLEW(The OpenGL Extension Wrangler Library)는 여러 종류의 컴퓨터 플랫폼(Cross Platform) 환경에서 작동 가능한 오픈소스 형태의 C/C++ 확장 라이브러리입니다. GLEW는 효율적인 실시간(run time) 메커니즘을 제공하는데, 이 메커니즘은 사용자의 플랫폼(Window, Mac 등...)에 적합한 OpenGL 기능들을 결정합니다. GLEW는 다양한 운영체제를 지원합니다.
(GLEW에서 지원하는 OS: Windows, Linux, Mac OS X, FreeBSD, Irix, Solaris)
여하튼 GLEW의 기능에 대해서는 여기까지 간단히 알아보고, 본격적으로 GLEW를 우리가 전에 만들어 놓은 프로젝트에 적용해봅시다.
[실습 1] GLEW 설치하기
① GLEW 홈페이지에 접속하여 Binaries Windows 32-bit and 64-bit 파일을 설치합니다.
② 다운로드한 파일의 압축을 해체합니다.
③ 프로젝트의 Dependencies 폴더의 하위 폴더로 GLEW 폴더를 생성하고, 압축 해제한 파일을 욺깁니다.
[실습 2] GLEW 프로젝트에 세팅하기
① [프로젝트 속성 페이지] > [구성 속성] > [C/C++] > [추가 포함 디렉터리]에 $(ProjectDir)\Dependencies\GLEW\glew-2.1.0-win32\glew-2.1.0\include 를 입력합니다.
② [프로젝트 속성 페이지] > [구성 속성] > [링커] > [추가 라이브러리 디렉터리]에 $(ProjectDir)\Dependencies\GLEW\glew-2.1.0-win32\glew-2.1.0\lib\Release\Win32 를 입력합니다.
③ [프로젝트 속성 페이지] > [구성 속성] > [링커] > [입력] > [추가 종속성]에 glew32s.lib를 추가합니다.
위의 실습을 잘 따라오셨다면, 프로젝트에서 GLEW 라이브러리를 사용하기 위한 준비가 대부분 끝났다고 봐도 무방합니다. 하지만, 아직 프로젝트 내에서 GLEW가 오류 없이 작동하는지 확인하지 못했습니다. 따라서 GLEW 소스 코드를 프로젝트에서 사용해보고, 소스 코드에 오류가 발생한다면 해당 오류를 고쳐야겠죠..? ㅠㅅㅠ
우선 GLEW 공식 문서의 Usage 카테고리에 접속하면, GLEW 초기화와 관련해서 아래와 같은 내용이 작성되어 있습니다.
위의 영어를 간략하게 해석하면, "OpenGL을 랜더링 할 수 있는 환경을 먼저 생성한 후, glewInit() 함수를 호출하여 확장 파일의 진입점을 초기화하시오."라고 설명하는 것을 알 수 있습니다. 우리는 이미 저번 튜토리얼에서 GLFW를 활용하여 OpenGL을 랜더링 할 수 있는 환경을 만들었기 때문에, glewInit() 함수를 호출하고 확장 파일의 진입점을 초기화할 수 있습니다. 그럼 실습을 통해 진행해볼까요?
[실습 3] glewInit() 함수를 호출하여 확장 파일의 진입점 초기화를 진행하자.
① glew.h 내부 함수를 사용하기 위해 #include <GL/glew.h>를 추가합니다.
② GLenum err = glewInit();을 소스코드에 추가합니다.
#include <GLFW/glfw3.h> #include <GL/glew.h> int main(void) { GLFWwindow* window; /* Initialize the library */ if (!glfwInit()) return -1; GLenum err = glewInit(); /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { /* Render here */ glClear(GL_COLOR_BUFFER_BIT); /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; }
이제 진입점을 초기화했으니, 소스 코드를 컴파일해볼까요? :)
오류 없이 컴파일이 진행되기를 기대했지만, 역시나 오류가 존재합니다. 그러면 오류를 해결하기 위해 어떤 오류가 출력되었는지 확인해볼까요?
오류의 출력 정보에는 "gl.h included before glew.h"라고 적혀있습니다. 간단히 해석해보면, "gl.h가 glew.h보다 먼저 포함되어야 한다."입니다. 근데 우리는 gl.h라는 헤더 파일을 포함한 적이 없습니다. 하지만 #include <GLFW/glfw3.h>가 떡하니 glew.h 위에 있습니다. 그리고 아래와 같은 합리적인 의심을 할 수 있죠.
'glfw3.h에서 gl.h를 포함하고 있지 않을까?'
그래서 glfw3.h 파일을 열어보고, Visual Studio 검색 기능을 통해 gl.h를 검색해보니, 떡하니 gl.h가 적혀있는 것을 확인할 수 있습니다.
그럼 범인을 찾았으니, 오류를 해결해볼까요?
[실습 3] glewInit() 함수를 호출하여 확장 파일의 진입점 초기화를 진행하자.
① #include <GL/glew.h>를 #include <GLFW/glfw3.h>보다 먼저 선언합니다.
② 컴파일...!
#include <GL/glew.h> #include <GLFW/glfw3.h>
하지만, 우리의 기대와는 달리 컴파일러가 오류를 또 뱉었습니다. =ㅁ=... 컴파일러가 뱉은 오류를 해결해봅시다.
[실습 4] 오류를 고치자.
① 첫 번째 오류는 error LNK2019: __imp__glewInit@0_main 함수에서 참조되는 확인할 수 없는 외부 기호 입니다.
② 구글에 __imp__glewInit을 입력하고, 상단에 검색되는 게시글에 들어가 오류를 해결할만한 질문과 코멘트가 있는지 확인합니다.
③ 다행히도 해당 게시물은 우리가 발생한 오류와 같은 종류의 오류에 해당하며, 정적 라이브러리 버전의 GLEW를 사용하였지만, GLEW_STATIC을 전처리기에 정의하지 않아 오류가 발생했다는 코멘트를 확인할 수 있습니다.
[실습 5] 전처리기에 GLEW_STATIC을 정의하자.
① [프로젝트 속성] > [구성 속성] > [C/C++] > [전처리기]를 선택합니다.
② [전처리기 정의]에 GLEW_STATIC을 추가합니다.
③ 컴파일...
라오이
이제 GLFW와 GLEW를 프로젝트에서 오류 없이 사용할 수 있으니, 다음 튜토리얼에서는 본격적으로 OpenGL을 사용하여 삼각형을 출력해보겠습니다. 다들 고생하셨습니다. ㅎㅁㅎ.. 저두 고생했구요.. ㅠㅠ..
REFERENCE
[1] The OpenGL Extension Wrangler Library - GLEW
[2] Glew in VS 2010: unresolved external symbol __imp__glewInit - stackoverflow
'학부의 잔재' 카테고리의 다른 글
[C++/Modern OpenGL] 1. OpenGL 개발 환경 세팅하기 (10) 2024.09.11 [Unity/Tutorial] 1. Unity와 Visual Studio Code 연동 (1) 2024.09.11 [Unity/XR Interaction Toolkit (VR)] 1. 패키지 세팅하기 (6) 2024.09.11 [Unity/XR Interaction Toolkit (VR)] 2. VR 세팅하기 (0) 2024.09.11