본문 바로가기

컴퓨터/리눅스

gcc

gcc 옵션

  -E  전처리를 실행하고 컴파일을 중단하게 한다

  -c  소스 파일을 컴파일만 하고 링크를 수행하지 않으며, 오브젝트 파일을 생성한다.

  -o  바이너리 형식의 출력 파일 이름을 지정하는데, 지정하지 않으면 a.out라는 기본 이름이 적용된다

  -I  헤더 파일을 검색하는 디렉토리 목록을 추가한다.

  -L  라이브러리 파일을 검색하는 디렉토리 목록을 추가한다.

  -l  라이브러리 파일을 컴파일 시 링크한다.

  -g  바이너리 파일에 표준 디버깅 정보를 포함시킨다.

  -ggdb  바이너리 파일에 GNU 디버거인 gdb만이 이해할 수 있는 많은 디버깅 정보를 포함시킨다.

  -O 컴파일 코드를 최적화시킨다.

  -ON 최적화 N단계를 지정한다.

  -DFOO=RAR  명령라인에서 BAR의 값을 가지는 FOO라는 선행 처리기 매크로를 정의한다.

  -static  정적 라이브러리에 링크한다.

  -ansi  표준과 충돌하는 GNU 확장안을 취소하며, ANSI/ISO C 표준을 지원한다. 이 옵션은 ANSI 호환 코드를 보장하지 않는다.

  -traditional  과거 스타일의 함수 정의 형식과 같이 전통적인 K&R(Kernighan and Ritchie) C 언어 형식을 지원한다.

  -MM  make 호환의 의존성 목록을 출력한다.

  -V  컴파일 각 단계에서 사용되는 명령을 보여준다.

 

자주 사용되는 옵션

-o 옵션

기능

생성되는 출력 파일 이름을 지정한다.

기본형

gcc o 출력파일이름 소스파일이름

 

-E 옵션

기능

전처리까지만 실행하고 결과를 화면에 출력한다.

기본형

gcc E 소스파일이름

 

-c 옵션

기능

전처리, 컴파일, 어셈블까지 실행하여 오브젝트 파일을 생성한다.

기본형

gcc c 소스파일이름

 

분할 컴파일

gcc 소스파일이름 소스파일이름 o 출력파일이름

 

 

-I 옵션

기능

표준 디렉토리가 아닌 위치에 있는 헤더 파일의 디렉토리를 지정한다.

기본형

gcc 소스파일이름 I디렉토리이름

 

 

 

 

라이브러리 지정 옵션

라이브러리란 자주 사용되는 유용한 함수에 대한 오브젝트 파일을 모아둔 것

 

ar t libc.a

기능

libc.a가 어떠한 오브젝트 파일로 이루어졌는가 확인.

 

 

라이브러리 직접 만들기 과정

1. plus.c minus.c 파일을 생성해 소스입력

vi plus.c

vi minus.c

 

2. 오브젝트 파일 만들기

gcc c plus.c minus.c

 

3. plus.ominus.o에 대한 libmy.a 라이브러리 생성 ar 명령어 r옵션은 .a 파일을 생성

ar r libmy.a plus.o minus.o

 

4. 라이브러리 파일에 목록을 추가. s 옵션

ar s libmy.a

 

-l 옵션

기능

표준 라이브러리가 아닌 라이브러리를 지정한다.

기본형

gcc 소스파일이름 l라이브러리이름

 

직접 만든 libmy.a는 표준 라이브러리가 아니므로 l 옵션을 주어 지정

하지만 오류 발생

[rhkdvy1200@MGP mylib]$ gcc 16_9.c -lmy

/bin/ld: cannot find -lmy

collect2: error: ld returned 1 exit status

오류가 발생한 이유는 링커인 ld가 라이브러리를 찾을 때 /lib, /usr/lib와 같이 정해진 디렉토리만 찾기 때문, libmy.a 라이브러리는 현재 작업 디렉토리의 하위 디렉토리인 mylib에 있으므로 링커가 찾지 못한다. -L 옵션으로 해결

 

-L 옵션

기능

사용할 라이브러리의 위치를 지정한다.

기본형

gcc 소스파일이름 L라이브러리위치

 

책에서는 gcc 16_9.c lmy Lmylib으로 하라고 했는데 오류가 남

[rhkdvy1200@MGP mylib]$ gcc 16_9.c -lmy -Lmylib

/bin/ld: cannot find -lmy

collect2: error: ld returned 1 exit status

 

인터넷 검색 결과 gcc 16_9.c L./ -lmy 이렇게 하라고 나옴

[rhkdvy1200@MGP mylib]$ gcc 16_9.c -L./ -lmy

[rhkdvy1200@MGP mylib]$ ls

16_8.c 16_9.c a.out libmy.a minus.c minus.o plus.c plus.o

[rhkdvy1200@MGP mylib]$ ./a.out

5 1

 

 

 

 

 

 

 

 

 

디버깅 관련 옵션

-g, -ggdb 옵션

기능

디버깅 정보를 삽입한다.

기본형

gcc g 소스파일이름

gcc ggdb 소스파일이름

 

-g 옵션에는 실행 파일에 삽입될 디버깅 정보의 양에 따라 g1, -g2, -g3과 같이 세가지 단계가 있다. 숫자 없이 g 옵션을 주면 기본적으로 g2 디버깅 정보가 삽입

옵션

의미

-g1

역추적 스택 덤프 생성에 필요한 정보를 포함하지만 지역변수, 문장 번호를 위한 디버깅 정보는 삽입하지 않는다.

-g2

확장 기호 테이블, 문장 번호, 지역과 외부 변수에 대한 디버깅 정보를 삽입한다.

-g3

-g2 옵션의 디버깅 정보와 모든 매크로 정의를 삽입한다.

 

-g 옵션을 주었을 때 생성된 파일과 없을 때 생성된 파일 크기가 다름

[rhkdvy1200@MGP mylib]$ gcc -g1 16_10.c -o debug1

[rhkdvy1200@MGP mylib]$ gcc -g2 16_10.c -o debug2

[rhkdvy1200@MGP mylib]$ gcc -g3 16_10.c -o debug3

[rhkdvy1200@MGP mylib]$ ls -l deb*

-rwxrwxr-x. 1 rhkdvy1200 rhkdvy1200 6641 Jun 29 07:22 debug

-rwxrwxr-x. 1 rhkdvy1200 rhkdvy1200 7449 Jun 29 07:23 debug1

-rwxrwxr-x. 1 rhkdvy1200 rhkdvy1200 7649 Jun 29 07:23 debug2

-rwxrwxr-x. 1 rhkdvy1200 rhkdvy1200 27281 Jun 29 07:23 debug3

 

-ggdb 옵션도 g와 거의 유사 특별히 다른 점은 디버깅 작업을 도와주는 추가 정보가 필요, gdb 외의 다른 종류의 디버거에서는 사용이 불가능하다

최적화 수행 전에 디버깅 하는 것이 좋다

 

 

 

 

 

 

 

 

 

 

 

최적화 옵션

장점: 불필요하거나 비효율적인 계산 과정이 효율적 계산 과정으로 대체되어 크기와 실행 시간 단축

단점: 컴파일 시간과 컴파일 과정에서 메모리 사용량 증가

 

-O 옵션

기능

코드를 최적화시킨다.

기본형

gcc O 소스파일이름

 

-O 옵션은 ON(숫자)로 최적화 단계 구분

N 값은 gcc 버전마다 차이가 나며 값이 커질수록 더욱 최적화된 코드가 나온다.

일반적으로 O1, -O2를 많이 사용

 

옵션

의미

-O1

-O 옵션과 같은 단계의 옵션으로 최소한으로 스레드 분기 동작 횟수를 줄이고, 호출된 각 함수 반환 시 스택에 인수를 모아 두었다 동시에 꺼내게 해준다.

-O2

-O1 단계의 최적화와 프로세서가 다른 명령어의 결과나 캐시 메모리 또는 메모리의 데이터를 기다리는 동안 컴파일러가 다른 명령어를 실행하도록 한다. 컴파일 시간이 더 오래 걸리지만, 수정된 코드는 더 최적화되어 실행이 빨라진다.

-O3

-O2 단계의 모든 최적화와 루프 해체, 그 밖의 프로세서 전용 특징을 포함한다.

 

'컴퓨터 > 리눅스' 카테고리의 다른 글

리눅스 실행 파일  (0) 2013.07.12
리눅스 시스템 끄기  (0) 2013.07.12
리눅스 명령어  (0) 2013.07.06
GNU와 유닉스 명령어  (0) 2013.02.13
LPIC  (0) 2013.02.13