사용자 도구

사이트 도구


raylib:컴파일_및_makefile
컴파일 및 makefile

문서의 이전 판입니다!


들어가며

소스파일을 통하여 raylib 실행해 보기

1. git clone

2. hello world 파일 컴파일해보기

3. 라이브러리 추가하기

4. 관련 라이브러리에 대한 추가 설명

가. 사용하는 라이브러리

나. 다른 라이브러리들의 위치

raylib 소스파일을 바꿔보기

1. 다양한 비트맵 폰트를 써보기

2. RAYLIB 소스파일 수정하기

3. raylib 재컴파일

4. 실행 파일 재컴파일

Makefile 만들기

1. 준비사항

2. Makefile 만들기

가. 최초 makefile

나. 설명

(가) raylib 라이브러리

우리는 libraylib.a 라는 라이브러리를 이용할 것이다. 따라서 이에 대한 경로를 지정해 줘야 한다.

RAYLIB_PATH        ?= C:/raylib5/raylib/src

로 하여 경로를 지정해 주었다.

(나) 컴파일러

c로 작성한 파일은 gcc로 컴파일 하고, c++로 작성한 파일은 g++로 컴파일 한다. 따라서 컴파일러를 지정해 주어야 한다.

CC = g++
(다) 디버그 모드/릴리스 모드

디버그 모드와 릴리스모드의 옵션을 설정해 준다. 다음과 같이 설정해주었다.

ifeq ($(BUILD_MODE),DEBUG)
    CFLAGS += -g -O0
else
    CFLAGS += -s -O1
endif
(라) 헤더파일과 라이브러리

헤어파일과 라이브러리를 각각 그 경로를 설정해주었다.

(마) 목적 파일 만들기

각 소스파일들을 기계어로 만들어야 한다.

그런데 우리가 배치파일(혹은 리눅스에서는 쉘 파일)을 만들지 않고 이렇게 Makefile을 만드는 이유는 뭘까?

Makefile을 만들면 이미 만들어진 목적파일은 생략하고 변경된 소스만 다시 목적파일로 만들어 주기 때문이다. 만약 배치파일로 만든다면 목적파일의 변경여부와 상관없이 매번 목적파일을 새롭게 만들것이다.

따라서 목적파일이 그대로 있어야만 한다. 그런데 목적파일이 내 소스파일과 섞이면 지저분하므로, 목적파일을 위한 디렉토리를 따로 만들어주자.

파일탐색기로 'obj'란 디렉토리를 만들자.

그리고 위의 소스에서 보는 바와 같이 각 목적파일은 'obj'라는 폴더 내부에서 목적 파일을 만드는 것이다. 하나만 따로 떼어서 살펴보자.

$(OBJ_DIR)/buttonActionMap.o : buttonActionMap.h buttonActionMap.cpp 
	$(CC)  -c buttonActionMap.cpp $(CFLAGS) $(INCLUDE_PATHS) -o $@

콜론(:)의 왼쪽, 즉 목적파일로 만들어지는 것을 타켓파일이라고 하고 오른쪽에 있는 것을 의존파일이라고 한다.

의존파일을 이용하여 목적파일을 만드는 것이다.

그런데 컴파일러(g++)에서 의존파일의 명칭을 바꾸려면 아웃풋을 뜻하는 -o 플래그 뒤에 그 의존파일의 전체 이름을 넣어야 한다.

우리의 경우 'obj'라는 폴더 아래에 'buttonActionMap.o'라는 목적 파일을 만들 것이다. 이는 'obj/buttonActionMap.o'라고 적을 수 있다.

이렇게 -o 플래그 뒤에 만들어질 목적 파일의 명칭을 적어야 한다.

Makefile에서 타켓파일을 지정한느 매크로는 '$@'이다. 따라서 이를 이용하면 타켓파일을 두번 쓸 필요는 없다.

(바) 아이콘

윈도우 환경에서 파일의 아이콘을 설정해줄 수도 있다. 우리는 아이콘을 다음과 같이 링크해 줬다.

ICON += $(RAYLIB_PATH)/raylib.rc.data
(사) 컴파일 하기

이제 만들어진 목적파일들을 링크하여줘야 한다.

#컴파일
tetris : $(OBJS)
	$(CC) $(CFLAGS)  $(OBJS) -o tetris $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) $(ICON)

tetris라는 이름으로 목적파일들을 컴파일 해준다. 그런데 라이브러리의 링크를 지시하는 플래그들은 맨 뒤에 와야 한다.

따라서 '$(LDFLAGS) $(LDLIBS) $(ICON)'까지는 반드시 맨뒤에 와야 한다. 만약 그렇지 않으면 'undefined …'하면서 컴파일러는 에러를 내뿜을 것이다.

(아) 메이크의 대상 지정하기

이렇게 Makefile을 만든 뒤에는 커맨드 창에서 'make' 명령어를 누르면 Makefile에 있는 매크로를 수행하면서 컴파일이 이루어진다.

그런데 make는 지정된 타켓만 make를 한다. 우리는 최종적으로 tetris라는 실행파일을 만들 것인데,

이러한 최종 실행파일은 tetris라는 이름으로 타켓이 지정되어 있다.

따라서 'make tetris'를 해야만 최종 목표인 컴파일까지 한다.

만약 아무런 지정도 안 해주고 단순히 'make'만 누르면 제일 처음에 설정한 타겟인 'buttonActionMap'만 목적파일로 만들어진다.

그런데 이렇게 매번 'make tetris'를 누르는 것도 귀찮기 마련이다. 그냥 'make'만 했으면 좋을것다.

따라서

아예

# Define default make program: Mingw32-make
MAKE = mingw32-make tetris

라고 하여 타겟 자체를 지정해 버리자.

그리고는 이렇게 코드를 짜면 모든 목적파일을 검토 한 후에 tetris라는 최종 파일을 만든다.

all:
	$(MAKE)

이제 커맨드 창에서 단순하게 'make'만 누르면 프로젝트 전체의 컴파일이 된다.

VS Code의 환경 설정하기

1. task.json 설정하기

2. launch.json

3. c_cpp_properties.json

로그인하면 댓글을 남길 수 있습니다.

raylib/컴파일_및_makefile.1700669606.txt.gz · 마지막으로 수정됨: 2023/11/23 01:13 저자 이거니맨