[0915] 과제: Makefile 만들기

2019. 9. 15. 12:59

객체지향 설계 시간에 대한 기본적인 리눅스 사용 방법을 익히기 위해서 Makefile을 만드는 실습을 했다.

리눅스에서는, 기존의 이클립스나 비쥬얼스튜디오같이 버튼 하나만 누르면 컴파일 해 주는 것이 아니라 직접 명령어로 컴파일을 하여(gcc -o 파일이름 실행파일이름) 실행 파일 목적 파일들을 만들어 주어야 한다. 그러나, 연계되어있는 파일들이 많을 경우에는 이것이 하나씩 하기로는 힘들어진다.

 

이것을 한번에 하는 방법을 코드로 작성하여 한꺼번에 실행파일을 만들어 주는 것이 바로 Makefile을 작성하는 법이다.

 

우선 각각의 파일 별 실행할 코드를 작성한다. 모든 코드는 아래와 같다.

 

main.cpp
print.cpp
student_id.cpp
print.h
student_id.h

.h로 되어있는 파일들은 헤더파일로, 다른 파일의 헤더에서 불러올 파일들을 입력해 놓는 것이다. 이것은 실행 파일에서 불러오는 파일 역할이므로 직접 이 파일을 컴파일 할 필요는 없어보였다. 

.cpp는 C++ 언어로 된 파일로, 이 코드를 이용하여 직접 코드가 작동되는 것으로 보였다. 아까 말했던 헤더파일(print.h 와 student_id.h)를 코드 안에 선언되어 있었고, 각각의 cpp코드들에는 그것으로 인해 작동될 함수들이 보였다.

 

우선 print()함수는 std::count의 입출력을 통해 student_id와 "김도희(이름)"을 출력하려고 하고 있다. 그러면 student_id()의 함수에서는 어떤 것을 출력할까 하고 student_id()함수가 선언된 student_id.cpp 파일의 코드를 보니 "201802055(학번)"을 리턴하고 있었다. 그렇다면 이러한 과정이 모두 한꺼번에 컴파일이 되어야 선언되지 않은 함수가 있다는 오류가 드지 않을 것이다. 

 

그 전에 앞서, 이 두 함수들을 모두 실행해주는 main.cpp도 당연히 실행파일이 되어야 할 것이다. 함수의 시작을 알리며 앞서 선언되었던 함수들을 가져와 표시해주는 역할을 하기 때문에 이 함수 역시 중요하다. 

 

그럼 이 함수들이 쓰여있는 코드들을 한꺼번에 실행파일로 만들어버리는 방법으로 Makefile을 아래와 같이 만들게 되었다. vim 에디터에서 Makefile만을 입력하여 아래와 같이 코드를 작성하였다.

 

맨 첫줄에는 .cpp 파일을 .o 목적파일, 실행 파일로 바꾸겠다는 것을 지정하였다. 일종의 확장자 알림이다. 

objects에는 컴파일하여 나온 파일들을 넣어 놓는다. 이것으로 object안에 있는 모두 가리켜, 파일들을 변수 하나로 이용가능하게 한다. 

CXX는 컴파일러를 설정하는 것이며, g++을 컴파일러로 설정하겠다는 뜻으로 작성하였으며 CPPLAACS는 간단히 말해 g++의 option 세팅이다. 

 

TARGET은 말 그대로, 명령어가 수행되어 나온 결과 파일(.o 파일 혹은 실행 파일)을 말하며, 나중에 make 명령어로 실행했을 때 test라는 이름의 실행파일이 만들어지게 되는 것을 볼 수 있다.

이것으로 파일리스트들을 argument로 받아서 command처리를 한다. 간단히 말해서 위의 코드를 예시로 대입해보자면, 명령어를 대입하여 실행 파일을 하나씩 만든다는 소리이다. 

이렇게 실행 파일을 하나하나 만든 다음, 다 만들고 난 다음에는 clean을 해준다. 여기서 -rf 명령어는 강제로 rm 지워준다, 라는 뜻이다. 

 

그리고 마지막에는 어떤 파일이 실행 파일로 바꿔질 것인지를 지정해주고 코드를 마친다. 이 코드를 실행하면 위와 같이 한꺼번에 명령어가 실행되는 모습을 보이며 최종적으로 test라는 실행 파일이 만들어지게 된다.

./test를 커맨드 창에 입력하면 결과가 잘 보이는 것을 볼 수 있다.

 

BELATED ARTICLES

more