사용자 도구

사이트 도구


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

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
raylib:컴파일_및_makefile [2023/11/23 00:37] 이거니맨raylib:컴파일_및_makefile [2023/11/24 00:46] (현재) – 더 읽기 이거니맨
줄 286: 줄 286:
  
 === 나. 설명 === === 나. 설명 ===
 +
 +== (가) raylib 라이브러리 == 
 +
 +우리는 libraylib.a 라는 라이브러리를 이용할 것이다. 따라서 이에 대한 경로를 지정해 줘야 한다.
 +
 +  RAYLIB_PATH        ?= C:/raylib5/raylib/src
 +
 +로 하여 경로를 지정해 주었다.
 +
 +== (나) 컴파일러 == 
 +
 +c로 작성한 파일은 gcc로 컴파일 하고, c++로 작성한 파일은 g++로 컴파일 한다.
 +따라서 컴파일러를 지정해 주어야 한다.
 +
 +  CC = g++
 +  
 +== (다) 디버그 모드/릴리스 모드 == 
 +
 +디버그 모드와 릴리스모드의 옵션을 설정해 준다. 다음과 같이 설정해주었다.
 +
 +<code>
 +ifeq ($(BUILD_MODE),DEBUG)
 +    CFLAGS += -g -O0
 +else
 +    CFLAGS += -s -O1
 +endif
 +</code> 
 +
 +== (라) 헤더파일과 라이브러리 ==
 +
 +헤어파일과 라이브러리를 각각 그 경로를 설정해주었다. 
 +
 +== (마) 목적 파일 만들기 ==
 +
 +각 소스파일들을 기계어로 만들어야 한다. 
 +
 +그런데 우리가 배치파일(혹은 리눅스에서는 쉘 파일)을 만들지 않고 이렇게 Makefile을 만드는 이유는 뭘까?
 +
 +Makefile을 만들면 이미 만들어진 목적파일은 생략하고 변경된 소스만 다시 목적파일로 만들어 주기 때문이다. 만약 배치파일로 만든다면 목적파일의 변경여부와 상관없이 매번 목적파일을 새롭게 만들것이다. 
 +
 +따라서 목적파일이 그대로 있어야만 한다. 그런데 목적파일이 내 소스파일과 섞이면 지저분하므로, 목적파일을 위한 디렉토리를 따로 만들어주자.
 +
 +파일탐색기로 'obj'란 디렉토리를 만들자.
 +
 +그리고 위의 소스에서 보는 바와 같이 각 목적파일은 'obj'라는 폴더 내부에서 목적 파일을 만드는 것이다. 하나만 따로 떼어서 살펴보자.
 +
 +<code>
 +$(OBJ_DIR)/buttonActionMap.o : buttonActionMap.h buttonActionMap.cpp 
 + $(CC)  -c buttonActionMap.cpp $(CFLAGS) $(INCLUDE_PATHS) -o $@
 +</code>
 +
 +콜론(:)의 왼쪽, 즉 목적파일로 만들어지는 것을 타켓파일이라고 하고 오른쪽에 있는 것을 의존파일이라고 한다. 
 +
 +의존파일을 이용하여 목적파일을 만드는 것이다.
 +
 +그런데 컴파일러(g++)에서 의존파일의 명칭을 바꾸려면 아웃풋을 뜻하는 -o 플래그 뒤에 그 의존파일의 전체 이름을 넣어야 한다. 
 +
 +우리의 경우 'obj'라는 폴더 아래에 'buttonActionMap.o'라는 목적 파일을 만들 것이다. 이는 'obj/buttonActionMap.o'라고 적을 수 있다.
 +
 +이렇게 -o 플래그 뒤에 만들어질 목적 파일의 명칭을 적어야 한다. 
 +
 +Makefile에서 타켓파일을 지정한느 매크로는 '$@'이다. 따라서 이를 이용하면 타켓파일을 두번 쓸 필요는 없다. 
 +
 +== (바) 아이콘 == 
 +
 +윈도우 환경에서 파일의 아이콘을 설정해줄 수도 있다. 우리는 아이콘을 다음과 같이 링크해 줬다.
 +
 +  ICON += $(RAYLIB_PATH)/raylib.rc.data
 +  
 +== (사) 컴파일 하기 == 
 +
 +이제 만들어진 목적파일들을 링크하여줘야 한다. 
 +
 +<code>
 +#컴파일
 +tetris : $(OBJS)
 + $(CC) $(CFLAGS)  $(OBJS) -o tetris $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) $(ICON)
 +</code>
 +
 +tetris라는 이름으로 목적파일들을 컴파일 해준다. 그런데 라이브러리의 링크를 지시하는 플래그들은 맨 뒤에 와야 한다. 
 +
 +따라서 '$(LDFLAGS) $(LDLIBS) $(ICON)'까지는 반드시 맨뒤에 와야 한다. 만약 그렇지 않으면 'undefined ...'하면서 컴파일러는 에러를 내뿜을 것이다. 
 +
 +
 +== (아) 메이크의 대상 지정하기 == 
 +
 +이렇게 Makefile을 만든 뒤에는 커맨드 창에서 'make' 명령어를 누르면 Makefile에 있는 매크로를 수행하면서 컴파일이 이루어진다.
 +
 +그런데 make는 지정된 타켓만 make를 한다. 우리는 최종적으로 tetris라는 실행파일을 만들 것인데, 
 +
 +이러한 최종 실행파일은 tetris라는 이름으로 타켓이 지정되어 있다. 
 +
 +따라서 'make tetris'를 해야만 최종 목표인 컴파일까지 한다. 
 +
 +만약 아무런 지정도 안 해주고 단순히 'make'만 누르면 제일 처음에 설정한 타겟인 'buttonActionMap'만 목적파일로 만들어진다.
 +
 +그런데 이렇게 매번 'make tetris'를 누르는 것도 귀찮기 마련이다. 그냥 'make'만 했으면 좋을것다.
 +
 +따라서 
 +
 +아예 
 +
 +<code>
 +# Define default make program: Mingw32-make
 +MAKE = mingw32-make tetris
 +</code>
 +
 +라고 하여 타겟 자체를 지정해 버리자. 
 +
 +그리고는 이렇게 코드를 짜면 모든 목적파일을 검토 한 후에 tetris라는 최종 파일을 만든다.
 +
 +<code>
 +all:
 + $(MAKE)
 +</code>
 +
 +이제 커맨드 창에서 단순하게 'make'만 누르면 프로젝트 전체의 컴파일이 된다. 
 +
 +
 +===== VS Code의 환경 설정하기 =====
 +
 +==== 1. task.json 설정하기 ==== 
 +
 +우리는 위 Makefile에서 딱 한가지 분기만 만들었다. 디버그와 릴리스 모드 분기다. 
 +
 +따라서 Makefile을 실행시키는 task.json에는 다른 인자들은 설정해 줄 필요 없고, 단지 하나, 디버그 모드에서는 
 +
 +  BUILD_MODE=DEBUG
 +  
 +를 넣어주면 된다. 굳이 이를 코드로 보여주면 다음과 같다.
 +
 +<file javascript task.json>
 +{
 +    "version": "2.0.0",
 +    "tasks": [
 +        {
 +            "label": "build debug",
 +            "type": "process",
 +            "command": "make",
 +            "args": [
 +                "BUILD_MODE=DEBUG"
 +            ],
 +            "windows": {
 +                "command": "C:/raylib/w64devkit/bin/mingw32-make.exe",
 +                "args": [
 +                    "BUILD_MODE=DEBUG"
 +                ]
 +            },
 +            "group": "build",
 +            "problemMatcher": [
 +                "$gcc"
 +            ]
 +        },
 +        {
 +            "label": "build release",
 +            "type": "process",
 +            "command": "make",
 +            "args": [    ],
 +            "windows": {
 +                "command": "C:/raylib/w64devkit/bin/mingw32-make.exe",
 +                "args": [    ]
 +            },
 +            "problemMatcher": [
 +                "$gcc"
 +            ],
 +            "group": {
 +                "kind": "build",
 +                "isDefault": false
 +            },
 +            "detail": "compiler: C:\\raylib\\w64devkit\\bin\\g++.exe"
 +        }
 +    ]
 +}
 +</file>
 +
 +==== 2. launch.json ==== 
 +
 +실행할 프로그램의 경로를 정확히 설정해 주면 된다. 
 +
 +우리는 tetris.exe 하나로만 실행파일을 만들 것이므로, 
 +
 +  "program": "${workspaceFolder}/tetris",
 +  
 +이렇게만 바꾸어 주면 된다.
 +
 +
 +==== 3. c_cpp_properties.json ==== 
 +
 +에디터가 인텔리센스를 보여줄 헤더의 위치를 설정해주는 것이다. 
 +
 +다음과 같이 해당 경로를 설정해 주면 된다.
 +
 +<code>
 +            "includePath": [
 +                "C:/raylib5/raylib/src/**",
 +                "${workspaceFolder}/**",
 +                "${workspaceFolder}/utils/**"
 +            ],
 +</code>
 +
 +===== 더 읽어보기 ===== 
 +
 +[[raylib:정적_라이브러리_만들기|C / C++  에서 정적라이브러리 만들기]]도 읽어보자
raylib/컴파일_및_makefile.1700667424.txt.gz · 마지막으로 수정됨: 2023/11/23 00:37 저자 이거니맨