컴파일 및 Makefile 만들기를 먼저 읽어보자
플래피버드게임의 소스를 보자
지금까지는 gui와 buttonactionimap도 모두 같은 폴더에 c++ 소스파일로 있다.
이 2개는 게임에 공통적으로 사용되는 요소이다.
그리고 바뀔 일도 없다. 따라서 미리 기계어로 만들어 놓은 후에 라이브러리화하여 연결해 주면 프로젝트의 컴파일이 빨라진다.
무엇보다도, 폴더 내에서 해당 파일들이 사라지므로 폴더가 보기 깔끔해진다.
즉, 공통적으로 사용하는 것들은 따로 분류하여 'lib'라는 폴더로 옮겨 놓을 것이다.
동적 라이브러리와 정적라이브러리가 있다.
MSVC에서는 동적 라이브러리는 dll, 정적라이브러리는 lib 확장자이다. gcc 계열에서는 동적라이브러니는 so, 정적라이브러리는 a이다.
주의할 것은, gcc 계열에서는 파일의 접두어로 'lib'를 붙여야 한다.
만약 raylib.a 라는 정적라이브러리면 파일이름은 'libraylib.a'이다.
목적파일을 대상으로 해서 라이브러리화 하면된다. 명령어는 ar이다.
통상 옵션으로 rcs를 이용한다.
각 옵션의 뜻은 다음과 같다.
r - 오브젝트 추가
c - 아카이브 생성
s - 인덱스 생성
이를 조합하면 다음과 같이 만들 수 있다.
ar rcs libfile.a file.o
Makefile을 만드는 방법은 컴파일 및 Makefile 만들기에서 알아 보았다.
라이브러리 만드는 방법은 목적 파일을 만든 후에, 실행파일을 만드는 대신에 라이브러리를 만드는 ar 명령어를 사용하면 된다.
이를 이용해서 Makefile을 만들면 다음과 같다.
# Define default C compiler: gcc # NOTE: define g++ compiler if using C++ CC = g++ AR = ar # Define default make program: Mingw32-make MAKE = mingw32-make buttonActionMap # Compile option CFLAGS += -Wall -std=c++14 -D_DEFAULT_SOURCE -Wno-missing-braces CFLAGS += -s -O1 # Define include paths for required headers # NOTE: Several external required libraries (stb and others) INCLUDE_PATHS = -I. -I$(RAYLIB_PATH) -I$(RAYLIB_PATH)/external -I'/utils' # 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 #목적 파일 만들기 OBJS = buttonActionMap.o # Default target entry # NOTE: We call this Makefile target or Makefile.Android target all: $(MAKE) buttonActionMap.o : buttonActionMap.cpp $(CC) -c buttonActionMap.cpp $(CFLAGS) $(INCLUDE_PATHS) -o $@ #컴파일 buttonActionMap : $(OBJS) $(AR) rcs libbuttonActionMap.a buttonActionMap.o
위에서 헤더파일은 따로 라이브러리화 하지 않았다. 헤더파일은 참조해야 하기 때문에 따로 둔 것이다.
c#엑서 c++의 라이브러리를 불러 올 수 있지만, 따로 c#용 선언파일을 만들어야 한다는 것을 생각해보면 이해가 갈 것이다.
출력하는 라이브러리 파일의 이름은 'libbuttonActionMap.a'로 lib접두어가 붙은 것을 확인하자.
이제 루트폴더에서 'buttonActionMap'이라는 폴더를 만든 후,
기존에 프로젝트의 루트폴더에 있떤 'buttonActionMap.h'와 'buttonActionMap.cpp'를 해당 폴더로 옮긴다.
이후에 make명령어를 실행하면 libbuttonActionMap.a 파일이 생긴다.
이 파일을 lib 폴더로 옮기자
이제 주된 프로젝트의 Makefile에서 라이브러리 디렉토리와 라이브러리 참조를 넣으면 된다.
물론, 목적파일로 만들라고 하였던 buttonActionMap 타겟은 지워야 할 것이다.
# Define library paths containing required libs. LDFLAGS = -L. -L$(RAYLIB_PATH) -L./lib # 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 -lbuttonActionMap
루프폴더에서 'buttonActionMap.h'와 'buttonActionMap.cpp'를 지워도 프로젝트가 잘 컴파일 되는 것을 알 수 있다.
이런 식으로 gui도 라이브러리화 하자.
참고로 헤더 파일은 참조해야 하므로, 헤더파일은 따로 어딘가에 놔두자.
예제 파일을 여기에 남긴다.