목차
서문
Linux 환경에서 Raylib를 설치하고 Makefile과 VS Code의 환경 설정하는 법에 대해 설명하려고 한다.
Linux는 데비안계열(우분투)을 기준으로 하였다1).
어차피 패키지 매니링 명령어의 경우 데비안 계열에서 'apt'가 arch 계열에서는 'pacman'으로 이름만 바뀌는 정도이니 데비안 계열이 아니더라도 크게 혼란은 없을 것이다.
환경 설정
리눅스에서 c나 c++을 사용할 수 있는 컴파일러가 설치되어야 있어야 한다.
어차피 대부분의 배포란 리눅스에는 설치되어 있지만, 혹시 모르니 다음 명령어를 터미널에서 입력하여 설치 여부를 확인하자
sudo apt update sudo apt install build-essential git sudo apt install libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev
Raylib 설치하기
1. Raylib 복사하기
Git 리포지토리에서 일단 Raylib를 복하자. 최상단 폴더에서 raylib를 설치하겠다.
cd ~ git clone https://github.com/raysan5/raylib.git raylib
2. Raylib 컴파일 하기
이에 raylib폴더 중에 src 폴더에 들어가서 src폴더 내에 있는 makefile을 실행시키자.
cd raylib/src/ make PLATFORM=PLATFORM_DESKTOP sudo make install
참고로 src폴더 내에 있는 makefile을 보면, 다음의 경로가 있다.
# RAYLIB_INSTALL_PATH should be the desired full path to libraylib. No relative paths. DESTDIR ?= /usr/local RAYLIB_INSTALL_PATH ?= $(DESTDIR)/lib # RAYLIB_H_INSTALL_PATH locates the installed raylib header and associated source files. RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include
즉, 컴파일한 라이브러리는 /usr/local/lib에 들어 있음을 알 수 있다.
Makefile 만들기
1. 프로젝트 폴더
아무거나 Raylib를 사용한 간단한 c혹은 c++ 프로그램을 만들자
/raylib/example/core 폴더에 있는 core_basic_window.c를 써도 된다2).
그런데 cpp를 이용할 것이므로 이 보다는 OOP 형태로 만들어진 예제를 이용하자.
내가 전에 작성한 글인 VS코드에서 Raylib CPP환경 설정하기를 참고하자
2. 상수 설정하기
makefile에서 사용할 상수(constant)를 설정하자. 주로 경로에 대해서 설정하면 된다.
# Define required raylib variables PROJECT_NAME ?= raylib_hello RAYLIB_VERSION ?= 5.5.0 RAYLIB_PATH ?= /home/(UserName)/raylib # Define raylib source code path RAYLIB_SRC_PATH ?= /home/(UserName)/raylib/src # Locations of raylib.h and libraylib.a/libraylib.so # NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD DESTDIR ?= /usr/local RAYLIB_INCLUDE_PATH ?= $(DESTDIR)/include RAYLIB_LIB_PATH ?= $(DESTDIR)/lib # Library type compilation: STATIC (.a) or SHARED (.so/.dll) RAYLIB_LIBTYPE ?= STATIC # Build mode for project: DEBUG or RELEASE BUILD_MODE ?= RELEASE # Define raylib release directory for compiled library RAYLIB_RELEASE_PATH ?= $(RAYLIB_PATH)/src
git을 통해 복사한 Raylib 코드는 우리가 아까 'cd ~'을 통해 홈의 루트에 설치했다.
따라서 탐색기에서 HOME에 가면 'raylib'폴더가 설치된 것을 알 수 있다.
이 위치는 '/home/(UserName)/raylib'이다. 여기서 (UserName)은 리눅스에서 사용자가 설정한 사용자 이름을 말한다.
그리고 아까 /raylib/src 폴더에서 make를 통해 컴파일한 라이브러리는 '/usr/local'에 설치되었다고 하였다.
이를 DESTDIR로 설정하면 된다.
3. 컴파일러와 메이크 파일 설정
우리는 c가 아니라 c++을 사용할 것이므로 컴파일러는 g++을 이용할 것이다.
따라서 gcc를 g++로 바꿔주자
# Define default C compiler: CC #------------------------------------------------------------------------------------------------ CC = g++ # Define default make program: MAKE #------------------------------------------------------------------------------------------------ MAKE ?= make
4. 컴파일러 플래그 옵션 설정
플래그 옵션은 다음과 같이 설정하면 된다.
참고로 윈도우에서는 아이콘을 만드는게 가능한데, 리눅스에서는 어떻게 만드는지 아직 모르겠다.
# Define compiler flags: CFLAGS #------------------------------------------------------------------------------------------------ # -O1 defines optimization level # -g include debug information on compilation # -s strip unnecessary data from build # -Wall turns on most, but not all, compiler warnings # -std=c99 defines C language mode (standard C from 1999 revision) # -std=gnu99 defines C language mode (GNU C from 1999 revision) # -Wno-missing-braces ignore invalid warning (GCC bug 53119) # -Wno-unused-value ignore unused return values of some functions (i.e. fread()) # -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec CFLAGS = -Wall -std=c++14 -Wno-missing-braces ifeq ($(BUILD_MODE),DEBUG) CFLAGS += -g -O0 else CFLAGS += -s -O1 endif # Additional flags for compiler (if desired) #CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),WINDOWS) # resource file contains windows executable icon and properties # -Wl,--subsystem,windows hides the console window CFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data endif ifeq ($(PLATFORM_OS),LINUX) ifeq ($(RAYLIB_LIBTYPE),STATIC) CFLAGS += -D_DEFAULT_SOURCE endif ifeq ($(RAYLIB_LIBTYPE),SHARED) # Explicitly enable runtime link to libraylib.so CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH) endif endif endif
5. 헤더파일과 라이브러리 파일 연결하기
컴파일 옵션에 다음을 추가하여 헤더파일과 라이브러리 파일을 연결한다.
# Define include paths for required headers: INCLUDE_PATHS # NOTE: Some external/extras libraries could be required (stb, easings...) #------------------------------------------------------------------------------------------------ INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external $(EXTRA_INCLUDE_PATHS) # Define library paths containing required libs: LDFLAGS #------------------------------------------------------------------------------------------------ LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src
리눅스 데스크탑은 윈도우와 마찬가지로 GLFW (Open GL Library)를 이용한다.
따라서 라이브러리 연결은 다음과 같은 플래그를 추가해야 한다.
# Define libraries required on linking: LDLIBS # NOTE: To link libraries (lib<name>.so or lib<name>.a), use -l<name> #------------------------------------------------------------------------------------------------ ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) ifeq ($(PLATFORM_OS),WINDOWS) # Libraries for Windows desktop compilation # NOTE: WinMM library required to set high-res timer resolution LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm endif ifeq ($(PLATFORM_OS),LINUX) # Libraries for Debian GNU/Linux desktop compiling # NOTE: Required packages: libegl1-mesa-dev LDLIBS = -lraylib -lGL -lm -lpthread -ldl -lrt # On X11 requires also below libraries LDLIBS += -lX11 # NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them #LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor # Explicit link to libc ifeq ($(RAYLIB_LIBTYPE),SHARED) LDLIBS += -lc endif # NOTE: On ARM 32bit arch, miniaudio requires atomics library LDLIBS += -latomic endif endif
6. 컴파일 명령
컴파일 명령은 다음과 같다.
# Define a recursive wildcard function rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) # Define all source files required SRC_DIR = src OBJ_DIR = obj # Define all object files from source files SRC = $(call rwildcard, *.cpp, *.h) #OBJS = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) OBJS ?= main.cpp # Default target entry # NOTE: We call this Makefile target or Makefile.Android target all: $(MAKE) $(MAKEFILE_PARAMS) # Project target defined by PROJECT_NAME $(PROJECT_NAME): $(OBJS) $(CC) -o $(PROJECT_NAME)$(EXT) $(OBJS) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) # Compile source files # NOTE: This pattern will compile every module defined on $(OBJS) #%.o: %.c $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM)
7. 소결
Makefile을 만들었으니 이제 컴파일을 할 수 있다.
커맨드라인에서 'make'명령어를 치면 실행파일을 만들어 주는 것을 알 수 있다.
리눅스 환경에만 국한하여 만든 makefile을 첨부한다.
Visual Studio Code 환경 설정하기
1. Task.json 설정하기
Code Editor 내에서 알아서 빌드할 수 있게 위에서 만든 Makefile을 호출하게 해보자
가. 경로 변수
VS Code에서 현재 파일명을 받아오는 변수 ${fileBasenameNoExtension}이고
현재 워크스페이스의 폴더명을 받아오는 변수는 ${workspaceFolderBasename}이다.
우리가 컴파일해서 만들 설치파일은 워크스페이스 폴더의 이름으로 만드는 것이 좋을 것이다3).
따라서 ${workspaceFolderBasename}를 경로변수로 활용하자.
나. 공통 인자
Task.json에서 우리가 실행할 명령어는 “make”이고 PLATFORM = “PLATFORM_DESKTOP”이다. 그리고 디버그 모드인 경우에는 “BUILD_MODE=DEBUG”를 추가하면 될 것이다.
"command": "make", "args": [ "PLATFORM=PLATFORM_DESKTOP", "BUILD_MODE=DEBUG" ],
다. 리눅스에 적용되는 인자
리눅스 환경에서는 다음의 인자를 추가하면 된다.
"linux": { "args": [ // "PROJECT_NAME=${fileBasenameNoExtension}", "PROJECT_NAME=${workspaceFolderBasename}.run", "DESTDIR=/usr/local", "RAYLIB_LIBTYPE=STATIC", "OBJS=*.cpp", "BUILD_MODE=DEBUG" ] },
OBJS에 “*.cpp”라고 하여 Makefile에서 컴파일 대상으로 된 OBJS를 모든 cpp파일로 설정해 준 것을 알 수 있다.
2. 나머지
결론
지금까지 만든 리눅스용 Raylib 템플릿 파일을 첨부한다.
더보기
1. VIM 에디터용 Syntax Highlight
VIM 에디터용 Raylib를 위한 Syntax Highlight에 대하여는 Raylib를 위한 VIM Syntax파일 만들기 를 참조하라.
2. 실전
이제 실제로 게임을 만들어보자
C++와 Raylib로 플래피버드 만들기를 읽어보자.
그런데 의외로 많은 사람들이 C 및 c++의 컴파일을 하는 방법을 모르는 사람들이 많다.
컴파일 및 Makefile은 꼭 일독할 것을 권한다.

로그인