raylib:컴파일_및_makefile
컴파일 및 makefile
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
raylib:컴파일_및_makefile [2023/11/21 23:18] – 이거니맨 | raylib:컴파일_및_makefile [2023/11/24 00:46] (현재) – 더 읽기 이거니맨 | ||
---|---|---|---|
줄 122: | 줄 122: | ||
===== raylib 소스파일을 바꿔보기 ===== | ===== raylib 소스파일을 바꿔보기 ===== | ||
- | ==== 다양한 비트맵 폰트를 써보기 ==== | + | ==== 1. 다양한 비트맵 폰트를 써보기 ==== |
다음 파일을 다운 받자. | 다음 파일을 다운 받자. | ||
줄 143: | 줄 143: | ||
그리고 폰트는 stb_image 등을 이용한다. 따라서 '/ | 그리고 폰트는 stb_image 등을 이용한다. 따라서 '/ | ||
- | 위와 같이 하여 컴파일 하면 한글이 다 안 보인다. | + | 위와 같이 하여 컴파일 하면 컴파일은 잘 되는데 실행해보면 한글이 다 안 보인다. |
raylib의 기본 비트맨 폰트 로더는 폰트 아틀라스를 하나만 로드하기 때문이다. 그렇다면 어떻게 해야 할까? | raylib의 기본 비트맨 폰트 로더는 폰트 아틀라스를 하나만 로드하기 때문이다. 그렇다면 어떻게 해야 할까? | ||
+ | |||
+ | ==== 2. RAYLIB 소스파일 수정하기 ==== | ||
' | ' | ||
줄 158: | 줄 160: | ||
+ | ==== 3. raylib 재컴파일 ==== | ||
+ | |||
+ | 이제 rtext.c를 고쳤으므로 libraylib.a라는 정적 라이브러리를 재컴파일 해줘야 한다. | ||
+ | |||
+ | raylib/src 폴더에서 다시 한번 make 명령어를 넣자. 그러면 라이브러리가 재컴파일 된다. | ||
+ | |||
+ | |||
+ | ==== 4. 실행 파일 재컴파일 ==== | ||
+ | |||
+ | 이제 다시 fontatlas폴더로 가서 | ||
+ | |||
+ | < | ||
+ | gcc -o main main.c | ||
+ | </ | ||
+ | |||
+ | 명령어를 수행하자. | ||
+ | |||
+ | 그러면 [[raylib: | ||
+ | |||
+ | 이제 앞으로는 그냥 loadfont()함수만 쓰면 한글도 제대로 잘 나온다. | ||
+ | |||
+ | |||
+ | ===== Makefile 만들기 ===== | ||
+ | |||
+ | ==== 1. 준비사항 ==== | ||
+ | |||
+ | makefile은 탭을 인식한다. 따라서 탭이 에디터에서 제대로 입력되게 준비할 필요가 있다. | ||
+ | |||
+ | 만약 VS 코드라면 아래 하단 상태표시줄에서 'tab 크기' | ||
+ | |||
+ | 관련 [[https:// | ||
+ | |||
+ | |||
+ | ==== 2. Makefile 만들기 ===== | ||
+ | |||
+ | 위의 멀티 아틀라스 소스에 대한 Makefile을 만든다고 해보자. | ||
+ | |||
+ | 하나의 소스만 컴파일 할 때에는 위와 같이 명령창에서 gcc 혹은 g++(c++로 만들 경우)로 명령어를 넣으면 되므로, | ||
+ | |||
+ | 여러가지 소스 파일이 있는 대상 프로젝트를 선택하자. [[raylib: | ||
+ | |||
+ | 위 소스의 폴더에 ' | ||
+ | |||
+ | Makefile이 이미 있다면 지우고 새로 만들자. | ||
+ | |||
+ | === 가. 최초 makefile === | ||
+ | |||
+ | <file makefile Makefile> | ||
+ | # Define required raylib variables | ||
+ | RAYLIB_PATH | ||
+ | # Define compiler path on Windows | ||
+ | COMPILER_PATH | ||
+ | # Build mode for project: DEBUG or RELEASE | ||
+ | BUILD_MODE | ||
+ | |||
+ | # Define default C compiler: gcc | ||
+ | # NOTE: define g++ compiler if using C++ | ||
+ | CC = g++ | ||
+ | |||
+ | # Define default make program: Mingw32-make | ||
+ | MAKE = mingw32-make tetris | ||
+ | # Compile option | ||
+ | CFLAGS += -Wall -std=c++14 -D_DEFAULT_SOURCE -Wno-missing-braces | ||
+ | |||
+ | ifeq ($(BUILD_MODE), | ||
+ | CFLAGS += -g -O0 | ||
+ | else | ||
+ | CFLAGS += -s -O1 | ||
+ | endif | ||
+ | |||
+ | # Define include paths for required headers | ||
+ | # NOTE: Several external required libraries (stb and others) | ||
+ | INCLUDE_PATHS = -I. -I$(RAYLIB_PATH) -I$(RAYLIB_PATH)/ | ||
+ | |||
+ | # Define library paths containing required libs. | ||
+ | LDFLAGS = -L. -L$(RAYLIB_PATH) | ||
+ | |||
+ | # Define any libraries required on linking | ||
+ | # if you want to link libraries (libname.so or libname.a), use the -lname | ||
+ | LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm | ||
+ | |||
+ | # Define all source files required | ||
+ | SRC_DIR = . | ||
+ | OBJ_DIR = obj | ||
+ | |||
+ | #목적 파일 만들기 | ||
+ | OBJS = $(OBJ_DIR)/ | ||
+ | |||
+ | # Default target entry | ||
+ | # NOTE: We call this Makefile target or Makefile.Android target | ||
+ | all: | ||
+ | $(MAKE) | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) -c game.cpp $(CFLAGS) $(INCLUDE_PATHS) -o $@ | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | |||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | |||
+ | #Icon file path | ||
+ | ICON += $(RAYLIB_PATH)/ | ||
+ | |||
+ | #컴파일 | ||
+ | tetris : $(OBJS) | ||
+ | $(CC) $(CFLAGS) | ||
+ | </ | ||
+ | |||
+ | === 나. 설명 === | ||
+ | |||
+ | == (가) raylib 라이브러리 == | ||
+ | |||
+ | 우리는 libraylib.a 라는 라이브러리를 이용할 것이다. 따라서 이에 대한 경로를 지정해 줘야 한다. | ||
+ | |||
+ | RAYLIB_PATH | ||
+ | |||
+ | 로 하여 경로를 지정해 주었다. | ||
+ | |||
+ | == (나) 컴파일러 == | ||
+ | |||
+ | c로 작성한 파일은 gcc로 컴파일 하고, c++로 작성한 파일은 g++로 컴파일 한다. | ||
+ | 따라서 컴파일러를 지정해 주어야 한다. | ||
+ | |||
+ | CC = g++ | ||
+ | | ||
+ | == (다) 디버그 모드/ | ||
+ | |||
+ | 디버그 모드와 릴리스모드의 옵션을 설정해 준다. 다음과 같이 설정해주었다. | ||
+ | |||
+ | < | ||
+ | ifeq ($(BUILD_MODE), | ||
+ | CFLAGS += -g -O0 | ||
+ | else | ||
+ | CFLAGS += -s -O1 | ||
+ | endif | ||
+ | </ | ||
+ | |||
+ | == (라) 헤더파일과 라이브러리 == | ||
+ | |||
+ | 헤어파일과 라이브러리를 각각 그 경로를 설정해주었다. | ||
+ | |||
+ | == (마) 목적 파일 만들기 == | ||
+ | |||
+ | 각 소스파일들을 기계어로 만들어야 한다. | ||
+ | |||
+ | 그런데 우리가 배치파일(혹은 리눅스에서는 쉘 파일)을 만들지 않고 이렇게 Makefile을 만드는 이유는 뭘까? | ||
+ | |||
+ | Makefile을 만들면 이미 만들어진 목적파일은 생략하고 변경된 소스만 다시 목적파일로 만들어 주기 때문이다. 만약 배치파일로 만든다면 목적파일의 변경여부와 상관없이 매번 목적파일을 새롭게 만들것이다. | ||
+ | |||
+ | 따라서 목적파일이 그대로 있어야만 한다. 그런데 목적파일이 내 소스파일과 섞이면 지저분하므로, | ||
+ | |||
+ | 파일탐색기로 ' | ||
+ | |||
+ | 그리고 위의 소스에서 보는 바와 같이 각 목적파일은 ' | ||
+ | |||
+ | < | ||
+ | $(OBJ_DIR)/ | ||
+ | $(CC) | ||
+ | </ | ||
+ | |||
+ | 콜론(: | ||
+ | |||
+ | 의존파일을 이용하여 목적파일을 만드는 것이다. | ||
+ | |||
+ | 그런데 컴파일러(g++)에서 의존파일의 명칭을 바꾸려면 아웃풋을 뜻하는 -o 플래그 뒤에 그 의존파일의 전체 이름을 넣어야 한다. | ||
+ | |||
+ | 우리의 경우 ' | ||
+ | |||
+ | 이렇게 -o 플래그 뒤에 만들어질 목적 파일의 명칭을 적어야 한다. | ||
+ | |||
+ | Makefile에서 타켓파일을 지정한느 매크로는 ' | ||
+ | |||
+ | == (바) 아이콘 == | ||
+ | |||
+ | 윈도우 환경에서 파일의 아이콘을 설정해줄 수도 있다. 우리는 아이콘을 다음과 같이 링크해 줬다. | ||
+ | |||
+ | ICON += $(RAYLIB_PATH)/ | ||
+ | | ||
+ | == (사) 컴파일 하기 == | ||
+ | |||
+ | 이제 만들어진 목적파일들을 링크하여줘야 한다. | ||
+ | |||
+ | < | ||
+ | #컴파일 | ||
+ | tetris : $(OBJS) | ||
+ | $(CC) $(CFLAGS) | ||
+ | </ | ||
+ | |||
+ | tetris라는 이름으로 목적파일들을 컴파일 해준다. 그런데 라이브러리의 링크를 지시하는 플래그들은 맨 뒤에 와야 한다. | ||
+ | |||
+ | 따라서 ' | ||
+ | |||
+ | |||
+ | == (아) 메이크의 대상 지정하기 == | ||
+ | |||
+ | 이렇게 Makefile을 만든 뒤에는 커맨드 창에서 ' | ||
+ | |||
+ | 그런데 make는 지정된 타켓만 make를 한다. 우리는 최종적으로 tetris라는 실행파일을 만들 것인데, | ||
+ | |||
+ | 이러한 최종 실행파일은 tetris라는 이름으로 타켓이 지정되어 있다. | ||
+ | |||
+ | 따라서 'make tetris' | ||
+ | |||
+ | 만약 아무런 지정도 안 해주고 단순히 ' | ||
+ | |||
+ | 그런데 이렇게 매번 'make tetris' | ||
+ | |||
+ | 따라서 | ||
+ | |||
+ | 아예 | ||
+ | |||
+ | < | ||
+ | # Define default make program: Mingw32-make | ||
+ | MAKE = mingw32-make tetris | ||
+ | </ | ||
+ | |||
+ | 라고 하여 타겟 자체를 지정해 버리자. | ||
+ | |||
+ | 그리고는 이렇게 코드를 짜면 모든 목적파일을 검토 한 후에 tetris라는 최종 파일을 만든다. | ||
+ | |||
+ | < | ||
+ | all: | ||
+ | $(MAKE) | ||
+ | </ | ||
+ | |||
+ | 이제 커맨드 창에서 단순하게 ' | ||
+ | |||
+ | |||
+ | ===== VS Code의 환경 설정하기 ===== | ||
+ | |||
+ | ==== 1. task.json 설정하기 ==== | ||
+ | |||
+ | 우리는 위 Makefile에서 딱 한가지 분기만 만들었다. 디버그와 릴리스 모드 분기다. | ||
+ | |||
+ | 따라서 Makefile을 실행시키는 task.json에는 다른 인자들은 설정해 줄 필요 없고, 단지 하나, 디버그 모드에서는 | ||
+ | |||
+ | BUILD_MODE=DEBUG | ||
+ | | ||
+ | 를 넣어주면 된다. 굳이 이를 코드로 보여주면 다음과 같다. | ||
+ | |||
+ | <file javascript task.json> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== 2. launch.json ==== | ||
+ | |||
+ | 실행할 프로그램의 경로를 정확히 설정해 주면 된다. | ||
+ | |||
+ | 우리는 tetris.exe 하나로만 실행파일을 만들 것이므로, | ||
+ | |||
+ | " | ||
+ | | ||
+ | 이렇게만 바꾸어 주면 된다. | ||
+ | |||
+ | |||
+ | ==== 3. c_cpp_properties.json ==== | ||
+ | |||
+ | 에디터가 인텔리센스를 보여줄 헤더의 위치를 설정해주는 것이다. | ||
+ | |||
+ | 다음과 같이 해당 경로를 설정해 주면 된다. | ||
+ | |||
+ | < | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ], | ||
+ | </ | ||
+ | |||
+ | ===== 더 읽어보기 ===== | ||
+ | |||
+ | [[raylib: |
raylib/컴파일_및_makefile.1700576287.txt.gz · 마지막으로 수정됨: 2023/11/21 23:18 저자 이거니맨