본문 바로가기

도구의발견

gcc의 실행과 옵션

GCC의 실행

gcc [-o outputfilename] [-c] [-g] [-O | -O2] [-Idirectory] [-Ldirectory] [-llibrary] sourcefilename

 gcc를 실행하기 위해서는 반드시 소스 파일을 적어주어야 하며 나머지 사항들을 컴파일을 위한 옵션들로 필요에 따라 적거나 생략할 수 있습니다. 또한 모든 옵션은 적는 순서와 상관이 없이 똑같은 기능을 합니다.

GCC의 옵션

  • -c
     이 옵션을 사용하면 링크의 과정은 생략되고 컴파일만 수행합니다. 만약 이 옵션이 사용된다면 링크와 관련된 -l 또는 -L 옵션은 무시됩니다.
  • -o outputfilename
     컴파일한 결과를 저장하는 파일명을 직접 지정해 주는 옵션입니다. 이 옵션이 사용되지 않으면 기본적으로 a.out이라는 실행 파일이 생성되며, -c 옵션이 주어졌을 때는 sourcefilename.o 파일이 생성됩니다. 기본적으로 생성되는 파일명을 원하지 않을 경우 이 옵션을 사용하여 바꿔주면됩니다.
  • -g
     실행파일을 생성할 때, 디버거를 위한 변수테이블을 함께 생성해 준다. 만약 이 옵션을 사용하지 않으면, 디버거를 사용할 수 없습니다.
  • -O 또는 -O2
     optimization을 지시해주는 옵션입니다. -O를 사용하였을 때보다 -O2를 사용하면 프로그램의 크기가 더 줄어듭니다. 물론 아무것도 사용하지 않은 것보다는 당연히 크기가 줄어들겠지요? 최적화에 대한 자세한 내용은 ``GCC-개요''의 ``최적화'' 기사를 참조하시기 바랍니다. 가끔은 -O2를 사용하면 프로그램의 수행 속도가 현저히 저하되기도 합니다. (특히 GCC의 옛날 버전)
  • -Idirectory
     이 옵션은 header파일을 찾는 root디렉토리를 적어주는 옵션입니다. 만약 C source파일에서

    #include <myheader.h>

    라고 적어 주었을 때, 만약 /usr/local/include 나 /usr/include 또는 GCC설치디렉토리/include 에 위치하고 있지 않다면 header파일을 찾을 수 없다는 에러를 발생시키게 되는데, 이 -I 옵션을 사용하여 myheader.h 파일이 위치한 디렉토리를 적어주면 header파일을 잘 찾을 수 있게 된다. 이 옵션은 프로그램의 크기가 커져서 현재 디렉토리가 아닌 곳에 header파일들을 모아 두었을 때나, X-window 프로그래밍과 같이 C의 표준 제공 라이브러리가 아닌 추가된 파이브러리의 header파일들이 저장된 디렉토리를 지정할 때 유용하게 사용될 수 있다.

  • -Ldirectory
     이 옵션은 ld 인 링커프로그램에 의해서 참조된다. *.so.*의 이름을 갖는 동적라이브러리나 *.a 또는 *.sa.*의 이름을 갖는 정적라이브러리들이 위치한 디렉토리가 /usr/lib 나 /usr/local/lib 또는 GCC설치디렉토리 가 아닌 경우 이곳에 그 디렉토리 이름을 적어주어야 만이 제대로 링크가 된다. 이 옵션을 잘 지정해 주지 못하면
    Undefined first referenced symbol in file test_me /var/tmp/cca001l81.o 
    ld: fatal: Symbol referencing errors. No output written to a.out
    와 같은 에러가 나온다.
  • -llibraryname
     -L 옵션과 함께 사용되면서 사용할 라이브러리를 직접 지정해 주는 것이다. lib*.a 의 이름을 갖는 라이브러리에서 `*'부분을 libraryname부분에 적어주면 된다. 예를 들어 sin()이나 cos() exp()와 같은 수학함수를 사용하였을 경우 ``-lm'' 이라고 적어주어야만 바로 위의 -L옵션 설명에서 나왔던 것과 같은 에러가 발생하지 않는다. -L옵션과 마찬가지로 이 옵션을 잘못 설정하면 같은 ``Undefined symbol''에러가 발생한다.
  • -Ddefine
     
    디버를 위해 소스내에 #ifdef이라는 코드를 자주 삽입 하곤한다. 하지만 매번 컴파일 할 때 마다 #define문구를 넣었다 뺏다 하는 것은 상당히 귀찮은 일이다. -D 옵션을 사용하면 소스 내에 마치 #define으로 선언 해 놓은 것과 같은 효과를 볼 수 있다.

실행 예제

gcc -g -I/usr/dt/include -I/usr/openwin/include -I/usr/ucbinclude -L/usr/dt/lib -L/usr/openwin/lib -L/usr/ucblib -D_NO_PROTO -c run.c
gcc -o vision -g -I/usr/dt/include -I/usr/openwin/include -I/usr/ucbinclude -L/usr/dt/lib -L/usr/openwin/lib -L/usr/ucblib -D_NO_PROTO graphic.o image_display.o image_load.o view.o memory.o dsp.o run.o -lXm -lXt -lXext -lX11 -lsocket -lgen -lm

 인클루드나 라이브러리 옵션을 동시에 여럿 선언할 경우 앞에서 부터 참조하게 된다. 그러므로 만약 똑같은 이름의 헤더파일이나 라이브러리 파일이 여러군데 존재할 경우 이 옵션을 사용해서 사용자가 우선순위를 정해줄 수 있다. 첫줄의 명령어는 run.c를 컴파일해서 run.o 라는 오브젝트 파일을 만들어 주는 것이고, 아랫줄의 명령어는 image_display.o ~ run.o 파일들을 Xm, Xt, Xext, X11, socket, gen, m 의 라이브러리를 사용해서 링크시켜주는 명령어 입니다. (참고로 이 명령 줄은 make에 의해서 자동으로 입력된 내용입니다.)

참 고 : http://blog.naver.com/nillwow/5794785

mail : kukuta@gmail.com

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!