OS/Linux - Ubuntu

[Linux - 리눅스 / Ubuntu - 우분투] 소프트웨어 컴파일러 - C 컴파일러, gcc

주누다 2015. 4. 25. 01:13
반응형

C 컴파일러 확인

- 사용자가 사용하는 고급 언어(ex:c 언어)를 기계어(실행 파일)로 변환하는 과정을 컴파일

- 컴파일을 해주는 소프트웨어를 '컴파일러' 라고 함

- 리눅스 자체가 C언어로 만들어졌고, C언어를 많이 사용하므로 C컴파일러가 설치되어 있음(?)

- 리눅스의 C컴파일러는 gcc.

======================================================================

sjw-lenovo@sjwlenovo-Lenovo-U310:~$ aptitude show gcc
Package: gcc                            
State: installed
Automatically installed: no
Version: 4:4.8.2-1ubuntu6
Priority: 옵션
Section: devel
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Uncompressed Size: 42.0 k
Depends: cpp (>= 4:4.8.2-1ubuntu6), gcc-4.8 (>= 4.8.2-5~)
Recommends: libc6-dev | libc-dev
Suggests: gcc-multilib, make, manpages-dev, autoconf, automake1.9, libtool,
          flex, bison, gdb, gcc-doc
Conflicts: gcc-doc (< 1:2.95.3), gcc-doc (< 1:2.95.3), gcc
Provides: c-compiler
Description: GNU C compiler
 GNU C 컴파일러입니다. GCC는 여러 플랫폼에 이식 가능하고 최적화를 하는 C
 컴파일러입니다.
 
 이 패키지는 기본 GNU C 컴파일러에 의존하는 패키지입니다 .

sjw-lenovo@sjwlenovo-Lenovo-U310:~$
======================================================================




간단한 C 프로그램 컴파일 및 실행 

1) C 프로그램 작성

======================================================================

sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ vi hello.c
/* hello.c

#include <stdio.h>


main(){

  printf("Hello. World!\n");

}

*/

======================================================================



2) C 프로그램 컴파일하기

- 컴파일 명령은 gcc

- 'gcc 소스 파일명' 과 같이 입력

- 실행 파일의 이름은 사용자가 지정하지 않으면 기본적으로 a.out 로 생성

======================================================================

sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ls
a.out  ch7  ch7.tar  hello.c
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$

======================================================================



3) C 프로그램 실행하기

- a.out 을 실행하면 됨

- 만약 'a.out' 을 찾을 수 없다고 나오면 현재 디렉터리가 경로에 설정되지 않았기 때문

- 경로를 지정해서 하면 실해이 됨

======================================================================

sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ a.out
a.out: 명령을 찾을 수 없습니다
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ls
a.out  ch7  ch7.tar  hello.c
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ./a.out
Hello, World!
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$

======================================================================



4) 실행 파일명 변경하기

- 'gcc'로 생성한 기본 실행 파일은 'a.out'

- 사용자가 원하는 이름으로 지정하려면 '-o' 옵션을 사용하면 됨

======================================================================

sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ls
a.out  ch7  ch7.tar  hello.c
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ gcc -o hello hello.c
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ls
a.out  ch7  ch7.tar  hello  hello.c
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ hello
'hello' 프로그램은 다음 패키지에서 찾을 수 있습니다:
 * hello
 * hello-debhelper
다음을 실행해 보십시오: sudo apt-get install <선택한 패키지>
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ./hello
Hello, World!
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$

======================================================================




make 명령 사용하기

- gcc 로 일일이 컴파일하여 하나의 실행 파일로 만드는 것은 매우 번거로운 작업

- 이를 간단하게 해결할 수 있는 방법으로 make 명령이 있음

- 'make' 명령은 makefile(또는 Makefile)에 설정된 정보를 읽어서 여러 소스 파일을 컴파일하고 링크하여

  최종 실행 파일을 만들어줌

- 오픈 소스 소프트웨어는 소스코드와 함게 makefile을 배포함

1) 소스 파일 준비

======================================================================

/* one.c

#include <stdio.h>

extern int two();

main(){
printf("Go to Module Two--\n");
two();
printf("End of Moule One. \n");
}

*/

====================================================================== 


======================================================================

/* two.c

#include <stdio.h>

two(){
printf("In Module Two--\n");
printf("-- This is a Module Two.\n");
printf("End of Module Two.\n");
}

*/

======================================================================



2) makefile 작성

- makefile 은 어떤 소스를 읽고 어떻게 컴파일하여 최종적으로 어떤 실행 파일을 만들면 되는지를

  make 명령에 알려주는 설정 파일

======================================================================

sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ vi makefile


/* makefile

TARGET=one
OBJECTS=one.o two.o

$(TARGET) : $(OBJECTS)
        gcc -o $(TARGET) $(OBJECTS)

one.o : one.c
        gcc -c one.c

two.o : two.c
        gcc -c two.c

*/

======================================================================


- makefile 에서 TARGET이나 OBJECTS는 사용자가 임의로 정한 매크로

- gcc 에서 -c 옵션은 .c 파일을 컴파일하여 오브젝트 파일인 .o 파일을 생성

- 이 .o 파일들을 연결하여 실행 파일을 만드는 것

- 기존의 .o  파일들 모두 삭제하고 make 명령을 실행

======================================================================

sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ls
a.out  ch7.tar  hello.c   one    one.o  two.o
ch7    hello    makefile  one.c  two.c
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ rm *.o
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ls
a.out  ch7  ch7.tar  hello  hello.c  makefile  one  one.c  two.c
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ make
gcc -c one.c
gcc -c two.c
gcc -o one one.o two.o
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$ ./one
Go to Module Two--
In Module Two--
-- This is a Module Two.
End of Module Two.
End of Moule One.
sjw-lenovo@sjwlenovo-Lenovo-U310:~/linux_ex/ch9$
======================================================================



반응형