linux gcc compile (컴파일 과정과 최적화)

Posted by 겨울에
2011. 2. 7. 15:02 scrap/ Linux
리눅스 GCC C 컴파일
출처 : http://cafe.naver.com/bitcampus.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=9

가장 많이 사용하는 컴파일 옵션

# gcc -W -Wall -O2 -o hello hello.c
설명: 모든 경고 메시지를 출력하고 최적화 2단계로 hello.c 소스코드를 컴파일해서 hello 실행파일을 만든다.


컴파일 과정

소스코드( .c) -- 전처리 --> 전처리후 소스( .i) -- C 컴파일 --> 어셈블리소스 ( .s) -- 어셈블리컴파일 --> 오브젝트 파일( .o ) -- 링크 --> 실행파일 (a.out)


컴파일 과정별 결과물을 확인하기 위한 방법

# gcc -v --save-temps -o hello hello.c

--save--temps : 각 과정별로 생성되는 파일을 지우지 않는다.
-v : 컴파일 과정에서 생기는 로고 파일을 출력한다. (이 옵션으로 각 컴파일 과정에서 일어 난 일들을 알아볼수 있다)
결론적으로 gcc라는 명령은 단지 각 컴파일 과정별로 실행해야 할 명령들을 전체적으로 관리하는 역할임을 알 수 있다.

또한 특정 단계까지만 컴파일 할 수 있다.

특정 단계까지만 컴파일 하기

1. 전처리 단계
# gcc -E -o hello.i hello.c (hello.c 소스코드를 전처리 해서 hello.i 파일에 저장한다.)

2. 어셈블리 파일 단계
# gcc -S -o hello.s hello.c (hello.c 소스코드를 컴파일해서 hello.s 어셈블리어 소스로 저장한다.)

3. 오브젝트 파일 단계
# gcc -c -o hello.o hello.c (hello.c 소스코드를 컴파일해서 링크 전 단계인 오브젝트 파일 hello.o 를 생성한다.)

매크로 지정하기

C 소스에서는 전처리 과정을 통해서 개발자들에게 소스코드의 간결성과 직관성을 제공한다.
전처리에서 사용하는 지정명령을 매크로라고 한다.
매크로는 라인에 #으로 시작하며 종류는 아래와 같다

#include

#define
#undef

#ifdef
#elif
#endif

이 중에 define 관련 매크로는 컴파일 때 동적으로 지정할 수 있어, 컴파일 옵션에 따라 다른 결과물을 만들 수 있는 소스코드의 가변성을 제공한다.

즉, 디버깅을 위한 코드와 릴리즈를 위한 코드를 하나의 소스코드로 만들 수 있으며, 컴파일 때 옵션을 통해 디버깅을 위한 실행파일, 릴리즈를 위한 실행파일의 제작이 가능하다.
예)
#ifdef DEBUG
printf("DEBUG #10 - %s", msg);
#endif
디버그용 컴파일
# gcc -DDEBUG -o hello hello.c
릴리즈용 컴파일
# gcc -o hello hello.c

혹은, 상이한 시스템 환경별 결과물을 같은 소스코드로 만들어 낼 수도 있다.
예)
#ifdev __WINDOWS__
system("del *.bak");
#elif __linux__
system("rm -f *.bak");
#endif

컴파일 
(__linux__와 __WINDOWS__ 는 각 시스템에서 기본적으로 지정되어 있는 매크로 이기 때문에 특별히 옵션으로 지정하지 않아도 된다)
# gcc -o hello hello.c 

최적화
같은 기능의 프로그램을 만들지만, 실행 속도나 메모리 점유율이 낮아지도록 최적의 코드로 만드는 것을 의미한다.
코드의 최적화는 크게 두가지로 나뉜다.

1. 중간코드의 최적화
소스코드를 기반으로 공통 부분과 불필요한 부분을 제거한다.

2. 목적코드의 최적화
메모리 로드의 기준에서 가장 효율적인 메모리나 레지스터의 할당을 하도록 한다.

최적화를 위한 옵션
-On : n은 최적화할 단계 
-O0은 최적화를 전혀 하지 않음
보통 가장 많이 사용하는 최적화의 단계는 -O2 이다.
또한 -Os를 통해서 크기의 최적화를 할 수 있다.

C언어의 표준
대부분의 C언어는 기본적으로 ANSI에서 제정한 C 언어의 문법을 따른다.
특히 ANSI에서 제정한 ANSI C89와 ANSI C99가 가장 대표적인데,
ANSI C89는 1989년에 제정한 C 표준으로 가장 기본적인 C 언어 문법을 지니고 있다. (c89(
ANSI C99는 1999년에 제정한 C 표준으로 여러 편리한 문법들이 추가되었다. (c99)

표준을 지정하는 방법
# gcc -std=c99 -o hello hello.c

이상. 끝

'scrap >  Linux' 카테고리의 다른 글

linux 웹서버 구축  (0) 2011.02.14
gcc로 C언어 컴파일하기. 실행하기.  (1) 2011.02.07
fedora linux emerald  (0) 2011.02.07
Linux 테마 사이트  (0) 2011.02.07
[ubuntu] emerald 설치. 적용. 깔기. 까는법  (0) 2011.02.07