본문 바로가기

Programming/Linux - Ubuntu

Ubuntu/C - 우분투 소스 컴파일, 실행

소스 코드를 작성 후 컴파일을 하고 실행파일을 만드는 과정을 알아보자


우분투에서 C 프로그램 소스를 컴파일 할 때는 gcc를 이용하는데, 이는 '컴파일러 드라이버'로 불린다.


소스 코드의 빌드 과정에 따라 실행파일을 생성한다.


1. 프리프로세서에 의한 파일 포함과 매크로 처리

2. 어셈블리 코드로 컴파일하고 어셈블 과정을 거쳐 오브젝트 파일로 변환

3. 오브젝트 파일 결합과 라이브러리 링크


위에서 프리프로세서란 고급언어를 또 다른 고급언어로 번역하는 번역기라고 할 수 있다. 


쉽게 풀어서 보면, 컴파일보다 먼저 실행되어 미리 처리하는 것인데, 컴파일러가 코드를 번역하기 전에 


통일된 언어로 맞추어 놓는 역할을 한다. 프리 프로세서에 대한 사항은 추후 포스팅에 자세히 알아보자.


먼저 hello.c 파일에 대한 컴파일러 과정이다.


hello.c 소스코드

#include<stdio.h>

void function1()
{
	printf("Hello World...Function1\n");
}

void function2()
{
	printf("Hello Wolrd...Function2\n");
}

int main() 
{
	function1();
	function2();
	return 0;
}


1. -o 옵션 컴파일


 # gcc hello.c -o hello


소스에 대해 명령어와 다음과 같이 실행을 하면 



만들어진 실행 파일 hello가 정상적으로 출력이 된다.


-o 옵션을 지정하지 않으면 실행 파일 명칭은 hello.out가 된다.


2. -c 옵션 컴파일


gcc에 -c 옵션을 사용하여 컴파일을 하면


 # gcc hello.c -c hello


아래와 같이 오브젝트 파일까지 생성된다.



하지만, 원래 실행파일 hello가 없는 상태에서도 -c 옵션을 컴파일을 할 수 있는 것으로 책에는 나와있지만


실제로 해보니 위와 같은 에러가 났다.



그래서 실행파일을 만든 후에 -c 컴파일을 해보니 생성은 되었지만 Warning이 발생했다. 원인 파악 중!!


이렇게 생긴 오브젝트 파일을 -o 옵션으로 컴파일을 하면 hello실행파일이 생성된다.


3. -s 옵션 컴파일


마지막으로 -s 옵션을 사용하여 컴파일을 하면


 # gcc hello.c -s hello


아래와 같은 어셈블리 파일까지 생성된다.



하지만, 위와 같은 알 수 없는 오류들로 인해... 어셈블리 파일 생성은 실패했다.


이상 gcc 세가지 옵션으로 컴파일을 하고 실행하는 법을 알아보았다.


2번째 오브젝트 파일과 3번째 어셈블리 파일 생성에서 오류에 대한 원인을 아는 분은 


댓글로 조언을 부탁드린다!!



참고 - 우분투 환경에서 C언어로 배우는 리눅스 프로그래밍 / 한빛미디어