정글사관학교 35일차 TIL: 이진트리 with 연결 리스트, make & Makefile

정글사관학교 35일차 TIL: 이진트리 with 연결 리스트, make & Makefile

반응형

RB트리를 구현하기 전에 개념을 익힐 겸 연결 리스트로 이진 트리를 구현하는 연습(by C)을 진행한다.

이진트리 with 연결리스트

typedef

typedef: struct 키워드 없이 구조체의 이름만으로 구조체를 선언할 수 있도록 하는 메소드.

- 참조: https://dojang.io/mod/page/view.php?id=409

ifndef

ifndef: 헤더파일 중복 방지 코드

- 참조: https://dhhwang89.tistory.com/59

make & Makefile

아까 잠깐 팀원 형한테 디버깅 도움을 받았는데, 가만 보니 gcc 명령어를 입력하지 않고 make 를 입력해서 바로 실행하더라. C언어 실행할 때면 vscode에서 플레이 버튼을 눌러 일일이 실행했는데 이렇게 하니 실행도 훨씬 빨랐다.

뿐만 아니라, 디버깅하면서 알게 된 사실인데 단일 파일만 있을 때와 달리 헤더 파일을 포함해 여러가지 object 파일을 묶어서 실행해야 할 경우에는 vscode에 있는 플레이 버튼을 누르면 실행이 되지 않더라.vscode로 플레이 버튼을 눌러 실행하면 약간 딜레이가 있는 편인데다가 아래처럼 실행되지 않는 상황까지 벌어지니 이제는 CLI로 컴파일해줘야 될 듯 하다.

 makefile 없이 플레이 버튼으로 실행하면 헤더 파일과 구현 파일, 그리고 main.c 사이에 참조가 되지 않아 에러가 뜨는 것을 볼 수 있다.

그런데 원래 gcc로 컴파일하려면 모든 오브젝트 파일 이름을 묶어줘야 하는데 shell에서 해당 디렉토리에 makefile 파일이 있다면, 오직 make 명령어로 컴파일을 실행한다. 이게 어떻게 가능한지 살펴보니, make 라는 명령어가 파일 관리 유틸리티이기 때문이다. 설명을 읽어보면

파일 간의 종속관계를 파악해 Makefile(기술파일)에 적힌대로 컴파일러에 명령하여 shell 명령이 순차적으로 실행될 수 있게 한다.

라고 나와있다.

make를 쓰는 이유

이미 위에서 썼듯, gcc 컴파일러를 쓰려면 main을 실행하기 위해 관련 오브젝트 파일을 전부 만들어줘야 한다. 하지만 make 를 쓰게 되면 세 가지 장점이 있다.

각 파일에 대한 반복적 명령의 자동화로 인한 시간 절약 프로그램의 종속 구조를 빠르게 파악할 수 있으며 시간 관리 용이 단순 반복 작업 및 재작성을 최소화

이게 무슨 말인고 하니, 위에서 연습 예제로 다뤘던 이진 트리 순회하는 파일을 실행하는 경우를 생각해보자.

1. gcc를 이용한 기본적인 컴파일 과정

현재 디렉토리에는 BinaryTreeList.c , BinaryTreeList.h(헤더파일) , main.c 이렇게 세 가지 파일이 있다.

1) C파일에서 object 파일 생성하기

먼저 각각 C파일에 대한 오브젝트 파일을 만들어줘야 하니

gcc -c -o BinaryTreeList.c gcc -c -o main.c

라고 명령어를 입력해 각 c 파일에 대한 오브젝트 파일을 생성한다.

2) 각 object 파일을 묶어 컴파일해 main.exe 실행하기

그 다음에는 실행 파일을 만들어줘야 하는데, 위에서 말한 것처럼 모든 오브젝트 파일을 묶어서 컴파일해 실행 파일을 생성한다.

gcc -o main.exe main.o BinaryTreeList.o

이를 실행하면 실행 파일 main.exe가 생성된다.

이제 이 파일을 실행하면 우리가 원하던 결과가 출력된다.

2. Makefile을 이용한 컴파일 과정

근데 이 과정을 make 명령어 단 하나만으로 실행할 수 있다. 물론, 그 전에 Makefile 파일을 미리 만들어둬야 한다. Makefile 을 만드는 과정은 아래 링크를 보면 보다 자세하게 이해할 수 있으니 Makefile 관련은 여기까지.

참고 링크: https://bowbowbow.tistory.com/12#make-makefile-%EC%9D%B4%EB%9E%80

반응형

from http://woonys.tistory.com/122 by ccl(A) rewrite - 2021-12-07 02:27:19