사용자 도구

사이트 도구


컴파일_및_makefile
컴파일 및 makefile

문서의 이전 판입니다!


들어가며

c와 c++은 개발자가 세심하게 조정할 수 있다는게 장점이자 단점이다. 컴파일 역시 하나 하나 라이브러리를 다 제대로 링크해 주어야 한다.

그런데 프로젝트의 크기가 커지다 보면 컴파일 명령어에 넣어야 할 변수들이 너무 많아지기 마련이다.

그렇기 때문에 makefile을 만들어서 매크로화 하여 컴파일하기 마련이다.

이하에서는 raylib를 이용하여 간단하게 컴파일 기초부터 시작하여 makefile을 만들고, 라이브러리화 하는 것까지 알아 볼 예정이다.

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

1. git clone

Raylib 설치 및 실행하기에서는 Itch.io에서 raylib 실행파일을 다운받아서 설치했었다. 그런데 사실 같이 딸려오는 notepad++이나 mingw는 우리에게 필요가 없다. 우리는 이미 이러한 것들이 있기 때문이다. 따라서 github에서 raylib의 최신버전을 먼저 가져오겠다.

먼저 아무드라이브에 raylib를 다운 받을 폴더를 만들자. 그 이후에 cmd를 쳐서 명령창으로 간 후 다음의 명령어를 실행한다.

git clone https://github.com/raysan5/raylib.git 

github 내에서 raylib 리포지터리를 찾은 후 코드를 누르면 클론 할 수 있는 git 주소가 나타난다.

Raylib Git Clone

그 주소를 커맨드라인 창에서 git clone 다음에 넣으면 raylib 소스파일이 내가 만들어 둔 폴더에 설치가 된다.

마우스 우클릭을 하여 Git Bash Command로 들어간 후에 위 명령을 실행해도 되지만, 굳이 그렇게 할 필요 없다. 커맨드창에서도 git 명령어는 실행된다.

자 이제 raylib 소스파일을 가져왔다.

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

raylib5 폴더(이하에서는 루트폴더라고 하자)에 exaples/core 폴더에 있는 core_basic_window.c 파일을 복사하자. 이제 이 루트폴더에서 컴파일을 해 볼 것이다. 편의상 core_basic_window.c 파일의 이름을 helloworld.c라고 변경하였다.

c는 gcc.exe, c++은 g++.exe가 컴파일 프로그램이다. 이를 이용해서 컴파일을 해야 한다.

다음 명령어를 넣어 보자.

gcc -Wall -std=c99 -Wno-missing-braces -Wunused-result helloworld.c

-Wall -std=c99 -Wno-missing-braces -Wunused-result 의 플래그는 굳이 지금단계에서 알 필요는 없다. 그냥 관용적으로 넣는다고 생각하면 편하다. 그 의미에 대해 알고 싶으면 raylib에 딸려오는 makefile을 살펴보면 각 플래그 마다의 뜻이 자세히 적혀 있다.

컴파일을 해보면 raylib만의 고유 함수들인 'InitWindow', 'SetTargetFPS' 등이 'undefine' 즉 정의되어 있지 않다고 한다.

3. 라이브러리 추가하기

raylib를 사용하려면 정의 파일인 raylib.h와 raylib그에 대한 구현 파일인 라이브러리 파일이 필요하다.

raylib/src 

폴더로 이용한다.

여기에는 라이브러리 파일을 묶을 수 있는 소스파일들이 존재한다. 여기에서 커맨드라인에서 'make' 명령어를 실행해본다.

그러면 폴더 내에 'libraylib.a'라는 파일이 생긴다.

gcc에서 a는 스태틱 라이브러리를, so는 동적 라이브러리를 의미한다. microsoft visual c에서는 lib가 정정 라이브러리를, dll이 동적 라이브러리를 의미한다고 한다1).

모든 라이브러리 파일은 접두어로 lib를 갖는다. 따라서 raylib라는 라이브러리를 만들면 'libraylib.a'라는 파일이 생기는 것이다.

이제 raylib/src 폴더에는 헤더파일들과 libraylib.a 라는 정적 라이브러리 파일이 생겼다. 바로 이 'libraylib.a' 파일을 참조할 것이다.

다음의 명령어를 실행해 본다.

gcc -o helloworld -Wall -std=c99 -Wno-missing-braces -Wunused-result helloworld.c   -L/raylib/src -lraylib -lopengl32 -lgdi32 -lwinmm

그러면 /raylib/src 폴더에 있는 'libraylib.a'를 참조하여 컴파일이 성공적으로 완성된 것을 알 수 있따. 따라서 helloworld.exe를 실행시키면 파일이 샐행된다.

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

가. 사용하는 라이브러리

근데 사실 위 명령어에서 -lopengl32 는 빼도 된다. 즉,

gcc -o helloworld -Wall -std=c99 -Wno-missing-braces -Wunused-result helloworld.c   -L/raylib/src -lraylib -lgdi32 -lwinmm

라고만 적어도 된다. helloworld.c에 쓰이는 drawtext() 함수는는 opengl을 전혀 이용하지 않는다는 것을 알 수 있다.

윈도우의 레거시 그래픽 구동 라이브러리인 gdi32를 이용하는 것이다.

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

그런데 우리는 여기에서 한 가지 물음이 생긴다. gdi32, winmm, opengl32등은 우리가 라이브러리 위치로 설정한 raylib/src 폴더에는 없다. 그런데 어떻게 이것을 포함할 수 있는 것일까?

그 이유는

C:\Windows\System32 

폴더가 윈도우 환경에서는 전역경로로 사용될 수 있는 것이 디폴트 값이기 때문이다.

즉, gdi32.dll, winmm.dll, opengl32.dll은 system32 폴더에 있다.

따라서 우리는 이에 대해서는 별도의 라이브러리 위치를 설정할 필요가 없는 것이다.

이를 통해서 raylib는 gdi32.dll, winmm.dll, opengl32.dll 등을 의존하여서 만들어진 것임을 알 수 있다.

이를 응용하면, 굳이 raylib를 거치지 않는다고 하더라도, gdi32.dll 등을 이용하여 그림을 바로 그릴 수도 있긴 하다.

또한 굳이 opengl을 다운받지 않아도 opengl을 이용할 수 있는 것이다(물론 directX 역시 윈도우에 기본적으로 내장되어 있다).

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

컴파일_및_makefile.1700573491.txt.gz · 마지막으로 수정됨: 2023/11/21 22:31 (바깥 편집)