나무 숲
GCC 컴파일 과정 본문
컴파일의 과정(간단하게), 및 gcc를 통한 컴파일 방법을 소개해 드립니다.
gcc를 사용하기 위해 저는 무난하게 우분투를 사용하였습니다.
너무 오랜만에 켰더니 반갑더군요.
컴파일 과정
GCC는 이름 그대로 (GNU Compiler Collection) 컴파일러입니다.
아래의 순서는 컴파일의 과정을 나타낸 것인데요, 이것들을 모두 묶어 gcc를 통해 간단하게! 소스 코드에서 실행 파일을 생성합니다.
소스 파일 생성 -> 전처리기(CPP; C Pre Processor) -> 전처리후 .i 파일 생성 -> 컴파일러(CC; C compiler) -> 어셈블리 코드 .s 파일 생성 -> 어셈블러(AS; Assembler) -> 오브젝트코드 .o 파일 생성 -> 링커(LD; Linker) & 재배치(Relocation) -> 실행 파일 생성
전처리기
전처리기는 컴파일이 시작되기 전에 작동되어, 코드에서 #으로 시작하는 내용들입니다. 매크로 정의(#define), 파일 첨가(#include), 소스 파일의 주석 제거 등의 기능이 있습니다. 전처리의 결과는 파일 하나로 만들어져 컴파일러에게 전달됩니다.
컴파일러
전처리기를 거친 소스 파일을 어셈블리어 파일로 변환합니다. (고급 언어를 기계어로 번역)
어셈블러
어셈블리어 파일을 오브젝트 파일로 변환합니다.
링커
오브젝트 파일들을 묶어 하나의 실행 파일을 생성합니다.
위 내용은 꽤 세부적인 과정인데 더 간단하게는 소스 파일 .c -> 오브젝트 파일 .o -> 실행 파일 .out 으로 요약되기도 합니다.
GCC 컴파일
방법은 위 그림과 같습니다.
헬로 월드를 출력하는, 하나로 만들어도 무방하지만 굳이 세 개로 쪼개어서 컴파일 해보겠습니다.
각각의 c 코드 파일은 각각 컴파일을 거쳐 각각 오브젝트 파일(목적 파일이라고도 불리더군요)이 되고, 링킹 과정을 통해 하나의 실행 파일이 됩니다.
우분투를 켜고 시작합니다.
저는 무난하게 vi 편집기를 사용했습니다. 너무 오랜만이라 명령어들이 기억이 안나서 늘 사용하던 한두개로 연명했습니다.
test1.c의 파일에는 저 내용만 포함합니다.
나중에 검색하다보니 w+q를 합쳐서 x 하나로 입력해도 된다고 하더군요.
이어서 test2.c의 파일 내용에는 저것만 포함합니다.
나중에 실행 스샷 찍을 때 보니 개행(/n)을 해주지 않아 보기에 조금 흠이 되었지만 귀찮아서 그냥 그대로 가게 되었습니다 ㅠ;
test3.c의 파일 내용입니다.
gcc 컴파일할 파일명
을 통해 순식간에 모든 과정이 포함된 컴파일이 진행됩니다.
ls 명령어를 통해 a.out이라는 실행 파일이 생성된 것을 보실 수 있습니다.
제가 예전에 뭔가를 하려 했다는 흔적도 보이네요.
./a.out
으로 파일을 실행할 수 있습니다.
이것은 굉장히 간단한 과정입니다. 걍 gcc 만 입력해서 결과값을 받으니까유.
명령어를 통해 하나하나 순서대로 하는 방법도 있습니다.
컴파일만 하기 ------------------------------------------------------------------------------------------------
(파일명은 gcc -c 파일1이름 파일2이름 ...이런식으로 여러개 가능합니당)
gcc -c 파일명
test3.c의 컴파일을 통해 test3.o가 생긴 것이 보입니다.
근데 하고 보니 좀 읭스러운게 안에 test2.c랑 test1.c가 컴파일이 안되어있는데 된 건가? 싶다가도
포함되어 있으니 다같이 된 듯 하네요.
그래서 궁금해져서 몇 개 해봤어요.
test3.o를 지우고, test1.c를 컴파일했습니다. 문제 없으니 잘 됩니다.
test2.c를 컴파일하면 안에 stdio.h 헤더 파일이 없으므로, 그리고 test1.c가 선언되어 있는 것도 아니므로, 그래서 링크되지도 않으므로 컴파일이 안되는 듯 합니다. 어쨌거나 오브젝트 파일이 생기기는 하지만 warning을 가지는 모양새입니다.
어쨌든 다시 본론으로!
.o -> .out --------------------------------------------------------------------------------------------------------
이제서야 말하지만 하다보면 실행 파일 이름을 a로 하고싶지 않을 수도 있습니다.
gcc 컴파일할 파일명 -o 실행파일 이름
으로 실행 파일 이름을 직접 지정할 수 있습니다.
a일 때와 마찬가지로
./실행파일 이름.out
으로 파일을 실행할 수 있습니다.
gcc -o 실행파일명 오브젝트파일명
gcc -o 실행파일명 오브젝트파일명
gcc -o 실행파일명 소스코드파일명
gcc 오브젝트파일명 -o 실행파일명
gcc 소스코드파일명 -o 실행파일명
경우의 수 4개 다 해봤는데 다 됩니다. 이유는.. .... ?
실행파일에 .out을 안붙여도 되던데 왜 되는지는 모르겠습니다 ㅠ; 아흑 지금은 되는것만 보고 넘어가도록 할게요
-
http://faculty.ycp.edu/~dhovemey/spring2011/cs320/lecture/lecture27.html
http://ko.cppreference.com/w/cpp/preprocessor
'Career' 카테고리의 다른 글
클럭 신호 Clock signal - 상승 에지rising edge, 하강 에지falling edge (0) | 2017.04.30 |
---|---|
gcc vi편집기 명령어 (0) | 2017.04.20 |
프로그래밍 오류의 종류 - 컴파일 에러/런타임 에러/링킹 에러/논리 에러/파스 에러 (1) | 2017.04.15 |
[C++] cin 에서 쓸만한 것들 ( istream 라이브러리) (0) | 2017.04.13 |
매개변수로서의 스택 사용 (0) | 2017.04.11 |