강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

GNU C컴파일러 gcc로 C소스 컴파일하는 방법

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

GNU C컴파일러 gcc C소스 컴파일하는 방법

 

 

 

 

 

오픈소스환경에서 가장 일반적으로 사용되는 컴파일러는 단연 gcc이다.

 

 

 

 

모든 리눅스에서gcc를 기본컴파일러로 사용하고 있다.

 

 

 

 

또한 리눅스커널 또한 gcc로 컴파일한다.

 

 

 

 

리눅스에서 컴파일되는 거의 모든 소프트웨어들은 gcc를 사용한다.

 

 

 

 

 

 

이번장이 리눅스컴파일러인 gcc와 리눅스 커널컴파일 방법에 대해서 배우기 때문에 gcc에대한 기본적인 사용법을 알고있어야 한다.

 

 

 

 

매우 간단하지만 알고 모르고의 차이는 엄청나다고 할 수 있다.

 

 

 

 

흔히 gcc를 일종의 명령어라고 말하는 분들이 있는데 이건 잘못된 생각이다.

 

 

 

 

말하였듯이 gcc는 명령어가 아니라 오픈소스진영인 GNU하에서 개발된 C컴파일러이다.

 

 

 

 

앞서 말한 바와 같이 리눅스에서 가장 많이 사용하는 컴파일러로서 리눅스 어플리케이션의 거의 모든 컴파일작업은 gcc로 컴파일한다.

 

 

 

 

필자가 근무하고있는 회사(리눅스포털사이트 : www.linux.co.kr)에서는 LUG회장 김태용씨가 집필한 『리눅스 개발자를 위한 gcc로 배우는 C++』이라는 책을 출판할 정도로 gcc라는 컴파일러에 대해서 배우는 것은 다소 어려울 수 있다.

 

 

 

 

gcc는 리눅스시스템에서 주로 사용하는 GNU기반의 C컴파일러이기 때문에 gcc에 대해서 배운다라는 의미는 C언어를 배운다라는 것과 거의 같다고 볼 수 있다.

 

 

 

 

하지만 우리가 지금 배우고 있는 것은 리눅스 시스템관리자들이 실무에서 실제로 사용하는 시스템관리명령어들에 대한 것이므로 C언어에 대한 부분을 언급하는 것은 다소 무리가 있다.

 

 

 

 

따라서 우리는 gcc를 이용하여 컴파일을 하는 방법에 대해서만 간단히 설명할 것이다.

 

 

 

 

 

 

, 그럼 이제 간단한 C프로그램을 작성하여 gcc로 컴파일을 해보도록하겠다.

 

 

 

 

아래의 C소스의 파일명은 superuser.c라는 C소스파일로서 gcc의 예를 들기 위하여 간단히 작성한 것이다.

 

 

 

 

[root@sulinux root]# cat superuser.c

#include <stdio.h>

 

int

main ( void )

{

printf ( "Welcome, www.linux.co.kr \n" );

return 0;

}

 

[root@sulinux root]#

 

 

위의 예는 superuser.c라는 C소스파일의 내용을 확인한 것이다.

 

 

 

 

이미 말했듯이 이 책에서는 C문법에 대한 설명을 다루지 않는다.

 

 

 

 

C문법에 대한 설명은 C전문서적을 참고하기 바란다.

 

 

 

 

 

 

그리고 다음은 앞에서 확인한 superuser.c파일을 ls명령어로 확인한 것이다.

 

 

 

 

 

 

[root@sulinux root]# ls -l

total 4

-rw-r--r--    1 root     root          106 Mar 25 23:10 superuser.c

[root@sulinux root]#

 

gcc로 컴파일을 하는 가장 기본적인 형식은 다음과 같다.

 

 

 

 



컴파일형식 : gcc C소스파일명

 

아래의 예는 superuser.c라는 C소스파일을 gcc로 컴파일하는 간단한 예이다.

 

 

 

 

 

 

[root@sulinux root]# gcc superuser.c

[root@sulinux root]#

[root@sulinux root]# ls -l

total 16

-rwxr-xr-x    1 root     root        11602 Mar 25 23:13 a.out

-rw-r--r--    1 root     root          106 Mar 25 23:10 superuser.c

[root@sulinux root]#



 

 

 

위에서 gcc로 컴파일 할 때에 아무런 에러메시지없이 종료되었다면 컴파일이 정상적으로 종료되었다는 것을 의미하며 만약 에러가 발생하였다면 그에 대한 에러메시지를 출력하게 된다.

 

 

 

 

 그리고 생성된 실행파일은 a.out이라는 파일이다.

 

 

 

 

gcc로 컴파일 할 때에 생성될 실행파일을 지정하지 않으면 a.out이라는 파일이 기본적으로 생성된다.

 

 

 

 



그리고 아래의 예는 생성된 실행파일을 실행한 예이다.

 

 

 

 

a.out이라는 파일을 실행하면 컴파일되어 생성된 a.out이라는 실행파일이 실행되어 그 결과를 출력한다.

 

 

 

 

a.out의 실행결과 “Welcome, www.linux.co.kr”이 출력된 것이다.

 

 

 

 

 

 

[root@sulinux root]# ./a.out

Welcome, www.linux.co.kr

[root@sulinux root]#

 

이제 gcc로 컴파일을 할 때에 생성될 실행파일명을 지정하여 컴파일 하면 지정한 파일명으로 실행파일이 생성된다.

 

 

 

 

아래의 예는 superuser.c소스파일을 gcc로 컴파일 하여 생성되는 실행파일로 superuser를 지정한 것이다.

 

 

 

 

 

 

[root@sulinux root]# ls -l

total 4

-rw-r--r--    1 root     root          106 Mar 25 23:10 superuser.c

[root@sulinux root]#

[root@sulinux root]# gcc -o superuser superuser.c

[root@sulinux root]#

[root@sulinux root]# ls -l

total 16

-rwxr-xr-x    1 root     root        11602 Mar 25 23:21 superuser

-rw-r--r--    1 root     root          106 Mar 25 23:10 superuser.c

[root@sulinux root]#

 

 

 

 

 

gcc로 컴파일시에 생성될 실행파일명을 지정할 때에는 -o옵션 다음에 파일명을 지정하면 된다.

 

 

 

 

위의 예에서는 생성될 실행파일명으로 superuser로 지정하였기 때문에 superuser라는 실행파일이 생성된 것이다.

 

그리고 다음은 생성된 superuser파일을 실행한 예를 보인 것이다.

 

 

 

 

 

 

[root@sulinux root]# ./superuser

Welcome, www.linux.co.kr

[root@sulinux root]#

 

 

 

즉 이번 예에서는 superuser.c라는 C소스파일을 gcc로 컴파일하여 그 결과로 생성된 superuser라는 실행파일을 실행한 것이다.

 

 

 

 

실행결과 “Welcome, www.linux.co.kr”라는 문장이 출력된 것을 확인 할 수 있다.

 

 

 

 

 

 

앞의 예에서는 gcc로 컴파일 하는 가장 일반적이고 가장 기본적인 방법을 설명하였다.

 

 

 

 

 

 

그럼 이제 컴파일 과정에 대해서 좀 더 자세히 알아보도록 하겠다.

 

 

 

 

즉 우리가 생각하고 있는 컴파일이라는 개념을 다시 정리해보겠다.

 

 

 

 

참고로 C프로그램에 있어서 가장 기본적인 설명이겠지만 이 책에서 C프로그램을 다루는 것은 아니므로 깊이 있는 설명은 생략하고 gcc를 이용한 컴파일과정의 이해에 필요한 부분만을 설명하겠다.

 

결론적으로 말하면 앞의 예에서 gcc로 수행했던 컴파일은 컴파일작업+링크작업을 동시에 수행한 것이다.

 

 

 

 

이를 좀 더 정리하면 다음과 같다.

 

 

 

 



컴파일작업 : C소스파일을 입력으로 하여 목적파일(object file)을 생성해내는 과정을 의미한다.

 

 

 

 

 

 

링크작업 : 컴파일결과 생성된 목적파일들에 필요한 함수들과 라이브러리들을 연결하여 바이너리형태의 실행파일을 만들어내는 과정이다.

 

 

 

 

 

 

즉 앞의 예에서 gcc superuser.c파일을 컴파일 하면 컴파일과정 후에 링크작업을 자동으로 해준다.

 

 

 

 

그리고 링크작업의 결과 실행파일이 생성된 것이다.

 

 

 

 

 

 

그렇다면 이번 예에서는 컴파일작업과 링크작업을 따로따로 수행해보도록 하겠다.

 

 

 

 

아래의 예는 gcc컴파일러에 -c옵션을 사용한 것으로 -c옵션은 컴파일작업만 수행할 뿐 링크작업은 수행하지 말라는 옵션이다.

 

 

 

 

즉 목적파일만 생성하라는 옵션이다.

 

 

 

 

 

 

[root@sulinux root]# gcc -c superuser.c

[root@sulinux root]#

[root@sulinux root]# ls -l

total 36

-rw-r--r--    1 root     root          106 Mar 26 00:11 superuser.c

-rw-r--r--    1 root     root          832 Mar 26 00:11 superuser.o

[root@sulinux root]#

 

위의 “gcc -c superuser.c”의 결과 생성된 superuser.o파일은 컴파일결과로 생성된 목적파일로서 링크작업이 수행되지않은 단지 목적파일일 뿐이다.

 

 

 

 



그리고 이번에는 위에서 생성된 superuser.o라는 목적파일을 가지고 링크작업을 수행하는 예이다.

 

 

 

 

 

 

[root@sulinux root]# gcc -o superuser superuser.o

[root@sulinux root]#
[root@sulinux root]# ls -l

total 36

-rwxr-xr-x    1 root     root        11602 Mar 26 00:12 superuser

-rw-r--r--    1 root     root          106 Mar 26 00:11 superuser.c

-rw-r--r--    1 root     root          832 Mar 26 00:11 superuser.o

[root@sulinux root]#

 

 

 

 

즉 위의 예는 “gcc -o superuser superuser.o”는 목적파일(superuser.o)을 가지고 링크작업을 수행한 것이다.

 

 

 

 

그 결과 -o옵션에서 지정한 실행파일명(superuser)으로 실제 실행파일을 생성한 것이다.

 

 

 

 

 

 

즉 이번 예는 gcc를 이용하여 컴파일작업과 링크작업을 각각 분리하여 수행한 것이다.

 

 

 

 

이번 예에서 말하고자 는 것은 우리가 흔히 C 소스파일을 가지고 실행파일을 만들어내는 컴파일이라는 것은 컴파일작업과 링크작업을 함께 수행한다는 것을 의미한다.

 

 

 

 

보다 확실한 이해를 위하여 다음 절의 설명을 보기 바란다.

 

 

 

 

 

 

다음은 gcc컴파일러를 이용하여 두개이상의 C소스파일을 각각 컴파일하고 그 결과 생성된 각각의 목적파일로 링크하는 예를 보겠다.

 

 

 

 

아래의 예를 보면 main.c print.c 두개의 C소스파일이 있다.

 

 

 

 

그리고 이 두개의 소스파일의 내용을 살펴보기위하여 cat명령어로 main.c print.c를 각각 살펴본 것이다.

 

 

 

 

 

 

[root@sulinux root]# ls -l

total 8

-rw-r--r--    1 root     root           80 Mar 25 23:53 main.c

-rw-r--r--    1 root     root           64 Mar 25 23:33 print.c

[root@sulinux root]#

[root@sulinux root]#

[root@sulinux root]# cat main.c

#include <stdio.h>

 

void print(void);

 

int main(void)

{

        print();

        return 0;

}

 

[root@sulinux root]#

[root@sulinux root]# cat print.c

void print(void)

{

        printf("Welcome www.linux.co.kr \n");

}

[root@sulinux root]#

 

위의 소스파일을 보면 main.c에서 print.c파일에 있는 print()함수를 불러들이고 있다.

 

 

 

 

 

 

이제 위의 C소스파일 두개를 동시에 컴파일 해보도록 하겠다.

 

 

 

 

즉 아래의 예는 main.c print.c를 동시에 컴파일 하는 예이다.

 

 

 

 

그 결과 목적파일인 main.o파일과 print.o파일이 각각 생성되었다.

 

 

 

 

 

 

[root@sulinux root]# gcc -c main.c print.c

[root@sulinux root]#

[root@sulinux root]# ls -l

total 16

-rw-r--r--    1 root     root           80 Mar 25 23:53 main.c

-rw-r--r--    1 root     root          704 Mar 25 23:54 main.o

-rw-r--r--    1 root     root           64 Mar 25 23:33 print.c

-rw-r--r--    1 root     root          808 Mar 25 23:54 print.o

[root@sulinux root]#

 

그리고 위의 컴파일 결과로 생성된 main.o파일과 print.o파일을 가지고 링크작업하도록 하겠다.

 

 

 

 

즉 아래의 예는 main.o print.o파일을 가지고 링크작업을 수행하며 -o옵션에서 지정한 superuser라는 실행파일을 결과로 만들어 낸다.

 

 

 

 

 

 

[root@sulinux root]# gcc -o superuser main.o print.o

[root@sulinux root]#

[root@sulinux root]# ls -l

total 28

-rw-r--r--    1 root     root           80 Mar 25 23:53 main.c

-rw-r--r--    1 root     root          704 Mar 25 23:54 main.o

-rw-r--r--    1 root     root           64 Mar 25 23:33 print.c

-rw-r--r--    1 root     root          808 Mar 25 23:54 print.o

-rwxr-xr-x    1 root     root        11675 Mar 25 23:55 superuser

[root@sulinux root]#

[root@sulinux root]# ./superuser

Welcome www.linux.co.kr

[root@sulinux root]#

 

이렇게 생성된 superuser라는 실행파일을 실행한 결과 “Welcome www.linux.co.kr”가 실행이 되었다.

 

 

 

 

 

 

지금까지 gcc컴파일러에 대하여 간단한 C소스를 가지고 설명하였다.

 

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,156 명
  • 현재 강좌수 :  36,513 개
  • 현재 접속자 :  227 명