컴파일, 링킹
1) 컴파일(compile) 컴파일(compile)은 단일 소스 코드 전체를 어셈블리어(기계어와 1 : 1 대응) 로 변환해준다. cpu가 연산하기 위해서는 기계어의 명령이 있어야 한다. (이 때, 목적코드라 불리는 .o 파일이 생성된다). 2) 링킹(linking) 이 과정이 끝나게 되면 링킹(linking)이 진행되는데, 말그대로 각기 다른 파일에 위치한 소스 코드들을 한데 엮어서 하나의 실행 파일로 만들어지는 과정이다. 실행파일은 목적파일 .o를 통해 만든 바이너리 파일이다. 링킹 과정에서 특정한 소스 파일에 있는 함수들이 어디에 있는지 찾는 과정을 거친다. 만약 str.c와 test.c두 파일을 만들었다고 가정해본다. 만약 str.c에서 커스텀 함수를 작성하고, 그 함수를 test.c에서 사용했다면 test.c 상단에 사용한 함수의 원형을 명시한다. 이때 링커(링킹을 해주는 프로그램)은 'test.c에서 커스텀 함수를 호출하는 경우 str.c 에서 찾아라'정도로 처리해준다. 덕분에 test.c 에서 다른 파일에서 작성한 함수를 호출하더라도 str.c 의 함수를 이용할 수 있게 되는 것이다. 헤더파일헤더파일의 필요성 앞에서 본 것처럼 파일을 여러개로 나눠야할 경우가 많다.
이 명령은 우리가 지칭하는 파일의 내용을 정확히 100% 복사해서 붙여넣는다. 따라서 #include "str.h" 라는 명령은 str.h 에 있었던 내용으로 컴파일이 시작하기 전에 변경된다. < > 로 감싸는 헤더파일은 컴파일러에서 기본으로 지원하는 헤더파일의 경우이고, " " 로 감싸는 헤더파일은 사용자가 직접 제작한 헤더파일의 경우이다.
printf, scanf 함수와 같이 매 함수를 쓰기 위해서 위 모든 내용을 쓰는 것 대신에 헤더파일 include 하나로 간단하게 해결할 수 있다. 보통 헤더파일을 만들 때에는 그 헤더파일에 있는 함수들이 정의되어 있는 소스 파일의 이름을 따서 짓는다. 위 경우 str.h 에 선언되어 있는 함수들이 모두 str.c 에 정의되어 있으므로 헤더파일의 이름을 str.h 로 하였다. MakefileMakefile의 필요성
아래의 간단한 코드를 예시로 들어본다.
먼저 위의 네가지 파일을 가지고 목적파일만 만들어본다. (컴파일만 한다.)
목적파일은 링킹을 통해 바이너리 파일로 바꿀 수 있다.
실행파일을 한번에 만들 수도 있다.
지금까지 했던 과정은 파일이 추가되거나 바뀔 때마다 계속 해줘야 한다. 하지만 Makefile을 이용한다면 수고가 현저히 줄어든다. Makefile의 구조 Makefile의 구조는 아래와 같다.
예시로 만든 Makefile이다. 추후 make 명령어로 실행시킬 수 있다.
만약 위의 코드에서 app.out 을 만들려는 코드가 제일 마지막에 간다면 main.o만 만들고 종료한다. 따라서 아예 첫 부분에 작성하거나 all 옵션을 주면 된다. all에는 최종으로 만들고 싶은 파일을 명시한다. all 옵션이 없는 경우 제일 첫 번째 Target만 실행시키고 종료한다. 아래의 코드는 위의 코드와 실행결과가 같다.
이번에는 컴파일 명령을 환경변수화 시켜서 컴파일 명령, 바이너리 파일 이름을 변수화했다. (os마다 다른 컴파일러가 존재한다.) 변경사항이 발생하면 환경변수 부분의 값만 바꿔주면 된다. 아래의 코드는 위의 코드와 실행결과가 같다.
환경변수를 선언하고, 선언한 변수는 $(변수)로 사용한다. OBJS는 오브젝트 파일로서, 공통적으로 쓰는 Makefile의 내부 변수다. 중복되는 용어를 개선해보겠다. 또한 오브젝트파일이 추가되면 .c 소스파일을 컴파일하는 명령어를 또 작성해야 하는 형태인데, 이를 개선해본다.
shell에서 다음과 같은 단축 표현을 지원한다.
CFLAGS, LDFLAGS라는 Makefile 내부변수를 활용해본다. clean이라는 타겟을 제작해본다.
Makefile을 통해 수정된 파일만 컴파일해서 바이너리파일을 다시 만드는 기능도 누릴 수 있다.
이처럼 Makefile을 만들어놓으면 무척 편리하다. 출처 컴파일, 링킹, 헤더파일 블로그 <모두의 코드>, "씹어먹는 C 언어 - <18 - 1. 파일 뽀개기 (헤더파일과 #include) >", modoocode.com/87 Makefile 추가로 보면 좋은 것들 Makefile 한글 문서 임대영, "GNU Make 강좌", doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html#toc8 |