FreeGLUT 환경 설정하기

armedHeistKino·2023년 9월 20일

시작하기 전에

학교 수업을 위해 컴퓨터에 OpenGL 환경을 설정해야 했는데, 이전에 CMake로 해본 적 있어 자만했더니 이번에는 GLUT을 사용한다고 한다...
지금 쓰고 있는 컴퓨터 환경에서 한 것도 아닐 뿐더러, 오래 전 일이고 심지어 문서로 기록도 제대로 안해놨으니 도움이 될리 만무했고, 이를 방지하기 위해 기록한다.

설치

IDE

Visual Studio Code를 사용한다.

FreeGLUT

FreeGLUT Windows 프로젝트 웹사이트에서 freeglut 3.0.0 MinGW Package를 다운받았다.

  • 공식 FreeGLUT 웹사이트에서는 linux 버전만 제공한다.

gcc

C 및 Cpp 컴파일러로는 gcc를 사용한다. 따라서 MinGW-w64를 설치해야 한다.

조치

이 영상에서 나온 모든 행동을 실행한다.

  • freeglut 3.0.0 MinGW Package 안에 있는 .a, .dll, 혹은 디렉토리를 옮긴다.
    freeglut\bin\x64\freeglut.dll >> windows\system32
    freeglut\include\GL >> mingw64\include
  • 안에는 freeglut을 위한 .h 헤더파일이 존재한다.
    freeglut\lib\x64\ 의 하위파일 >> mingw64\lib
  • 안에는 freeglut을 위한.a 파일이 존재한다.

코드에는 #include <GL/glut.h>을 작성하고, OpenGL 어플리케이션을 작성한다.

이렇게 로컬에서의 환경 구축은 끝난 것으로, 다음은 gcc에게 FreeGLUT을 링킹하도록 지시하는 배치파일을 작성할 것이다.

배치파일

상기 영상에서는 .c 파일 이름에 맞추어 직접 배치 구문을 작성해주었으나, 매번 바꾸기는 번거로워 작정하고 배치파일을 작성했다. 이번에 배치파일을 생성해보는건 처음이었는데 흥미로운 경험이었다. 이렇게 재밌는걸 왜 여태까지 꽁꽁 숨겨두고 있었나?!

structure.txt 파일은 C언어 파일이다. 반복되는 구조를 적어놓아 번거롭게 매번 초기화 함수 등을 작성할 필요가 없도록 조치한 것이다.

처음에 배치파일을 실행하면 사용자에게 프로젝트 이름을 입력받을 것이다. 프로젝트 이름으로 새로운 디렉토리와 .c 파일, 배치 파일을 생성하며, 최초에 이름만 정하면 사용자는 일일이 배치구문을 바꿀 필요가 없을것이다.

@echo off

chcp 65001
cls

echo "============================="
echo "Create a new graphics project"
echo "============================="
echo


:: Take a name from an user
set PROJECT_NAME=
echo "Type the name of a new project:"
set /p PROJECT_NAME=

REM PROJECT_NAME := 프로젝트 이름

:: Make a new directory
    :: if the name of a new directory exists:
    if exist %PROJECT_NAME% (
        echo Duplicated project name is not allowed!
        GOTO TERMINATE
    )
    mkdir %PROJECT_NAME%

:: Make a batch file in the new directory
    pushd "%~dp0"\%PROJECT_NAME%
    set USER_PATH=C:\Users\%username%\mingw64\

    set FIRST_STMT=gcc -c -o %PROJECT_NAME%.o %PROJECT_NAME%.c -I"%USER_PATH%include"
    set SECOND_STMT=gcc -o %PROJECT_NAME%.exe %PROJECT_NAME%.o -L"%USER_PATH%lib\x64" -lfreeglut -lopengl32 -lglu32
    set RUN_STMT=.\%PROJECT_NAME%.exe

    echo %FIRST_STMT% > run.bat
    echo %SECOND_STMT% >> run.bat
    echo %RUN_STMT% >> run.bat

    for /f "delims=" %%i in (../structure.txt) do echo %%i>>%PROJECT_NAME%.c

:TERMINATE
echo Done! Press any key to terminate batch. 
pause>nul

문제

GLU에서 제공하는 함수 gluPerspectivegluLookAtundefined 되었다는 에러는 상기 두 번째 구문, SECOND_STMT에서 -lglu32를 추가 작성하자 말끔하게 해결되었다.

해결할 과제


  1. gluPerspective 함수는 최신의 OpenGL 환경에서는 제거 removal된 함수라고 한다. 그러나 GLU를 링킹하자 굳이 glFrustum이라는 함수로 바꾸어 작성할 필요가 없었다. 이는 왜 그런것인가?
  2. 아직도 C로 작성된 파일의 컴파일과 링킹에 대해서는 잘 알지 못하는 것 같다. .a는 무엇인가? 컴파일의 중간 산출물은 무엇이 있는가? 눈으로 내용을 확인해보았는가? 링킹에는 어떤 방식이 있는가? .lib.dll의 차이는 무엇인가? 상기 배치 처리문에서 -lglu32를 추가했을 때 프로그램의 링킹에서는 무엇이 추가적으로 일어났는가? glu32.dllsystem32 디렉토리 안에 존재하는데, gcc는 어떻게 그 파일을 기가막히게 찾아내어 링킹까지 완료했는가?
  3. 상기 배치처리문에는 UTF-8을 인코딩으로 설정하였으나, 여전히 실행파일에서 한글이 깨져나온다. 이를 해결할 수 있는 방법은 무엇인가? 상당히 해묵은 문제다.
  4. 배치처리문에서 문자열의 일부를 교체하거나 이어붙이는 등 상당히 문자열 관련 처리가 많았는데, 좀 더 똑똑한 방법이 있을까?
profile
학부생이 아는척하기

0개의 댓글