웹사이트 검색

흔하지는 않지만 유용한 GCC 명령줄 옵션


이 페이지에서

  1. 각 컴파일 단계에서 중간 출력 참조
  2. 코드 디버깅 및 프로파일링 준비\n
  3. 결론

소프트웨어 도구는 일반적으로 여러 기능을 제공하지만 대부분의 사용자가 동의하듯이 모든 기능이 모든 사람에 의해 사용되는 것은 아닙니다. 일반적으로 말해서, 각 사용자는 자신의 요구 사항이 있고 해당 영역 내에서만 도구를 사용하므로 잘못된 것은 없습니다. 그러나 기능 중 하나가 언제 유용하게 사용될지 모르기 때문에 사용하는 도구를 계속 탐색하여 프로세스에서 소중한 시간을 절약하는 것이 좋습니다.

사례: 컴파일러. 좋은 프로그래밍 언어 컴파일러는 항상 많은 옵션을 제공하지만 사용자는 일반적으로 제한된 세트만 알고 사용합니다. 특히 C 언어 개발자이고 Linux를 개발 플랫폼으로 사용하는 경우 끝없는 명령줄 옵션 목록을 제공하는 gcc 컴파일러를 사용할 가능성이 높습니다.

원하는 경우 컴파일 프로세스의 각 단계에서 출력을 저장하도록 gcc에 요청할 수 있다는 것을 알고 있습니까? 경고 생성에 사용하는 -Wall 옵션이 일부 특정 경고를 다루지 않는다는 것을 알고 계십니까? 일반적으로 사용되지 않는 많은 명령줄 gcc 옵션이 있지만 예를 들어 코드를 디버깅하는 동안 특정 시나리오에서 매우 유용할 수 있습니다.

따라서 이 기사에서는 필요한 모든 세부 정보를 제공하고 필요할 때마다 이해하기 쉬운 예제를 통해 설명하는 몇 가지 옵션을 다룰 것입니다.

하지만 계속 진행하기 전에 이 튜토리얼에 언급된 모든 예제, 명령 및 지침은 Ubuntu 16.04 LTS에서 테스트되었으며 우리가 사용한 gcc 버전은 5.4.0임을 명심하십시오.

<엠>

각 컴파일 단계에서 중간 출력 보기

gcc 컴파일러를 사용하여 C 코드를 컴파일할 때 C 코드가 거치는 총 4단계가 있다는 것을 알고 계십니까? 전처리, 컴파일, 어셈블리 및 링크입니다. 각 단계가 끝나면 gcc는 다음 단계로 넘어가는 임시 출력 파일을 생성합니다. 이제 이들은 생성된 모든 임시 파일이므로 볼 수 없습니다. 우리가 볼 수 있는 것은 컴파일 명령을 실행했고 실행할 수 있는 바이너리/실행 파일을 생성한다는 것뿐입니다.

그러나 디버깅하는 동안 코드가 예를 들어 전처리 단계를 어떻게 처리하는지 확인해야 하는 요구 사항이 있다고 가정합니다. 그럼 어떻게 하시겠습니까? 좋은 점은 gcc 컴파일러가 표준 컴파일 명령에서 사용할 수 있는 명령줄 옵션을 제공하고 그렇지 않으면 컴파일러에 의해 삭제되는 중간 파일을 얻을 수 있다는 것입니다. 옵션은 -save-temps입니다.

이 옵션에 대한 gcc 매뉴얼 페이지의 내용은 다음과 같습니다.

           Store the usual "temporary" intermediate files permanently; place
           them in the current directory and name them based on the source
           file.  Thus, compiling foo.c with -c -save-temps produces files
           foo.i and foo.s, as well as foo.o.  This creates a preprocessed
           foo.i output file even though the compiler now normally uses an
           integrated preprocessor.

           When used in combination with the -x command-line option,
           -save-temps is sensible enough to avoid over writing an input
           source file with the same extension as an intermediate file.  The
           corresponding intermediate file may be obtained by renaming the
           source file before using -save-temps.

다음은 이 옵션을 사용하는 방법에 대한 아이디어를 제공하는 예제 명령입니다.

gcc -Wall -save-temps test.c -o test-exec

그리고 이것은 위에서 언급한 명령이 실행된 후에 모든 중간 파일이 실제로 생성되었는지 확인하는 방법입니다.

그래서 위의 스크린샷에서 볼 수 있듯이 test.i, test.s, test.o 파일은 <-save-temps 옵션. 이러한 파일은 각각 전처리, 컴파일 및 연결 단계에 해당합니다.

코드 디버깅 및 프로파일링 준비

소스 코드를 디버깅하고 프로파일링할 수 있는 전용 도구가 있습니다. 예를 들어 gprof는 프로파일링 목적으로 널리 사용되는 도구입니다. 그러나 코드 디버깅과 프로파일링을 준비하기 위해 gcc가 제공하는 특정 명령줄 옵션이 있다는 것을 알고 계십니까?

디버깅부터 시작하겠습니다. 코드 디버깅에 gdb를 사용하려면 gcc 컴파일러에서 제공하는 -g 명령줄 옵션을 사용하여 코드를 컴파일해야 합니다. 이 옵션은 기본적으로 gcc가 gdb가 프로그램을 성공적으로 디버깅하는 데 필요한 디버깅 정보를 생성하도록 허용합니다.

이 옵션을 사용하려는 경우 이 옵션에 대해 gcc 매뉴얼 페이지에서 제공하는 세부 정보를 살펴보는 것이 좋습니다. 일부 경우에는 중요할 수 있습니다. 예를 들어 다음은 매뉴얼 페이지에서 발췌한 내용입니다.

           GCC allows you to use -g with -O.  The shortcuts taken by optimized
           code may occasionally produce surprising results: some variables
           you declared may not exist at all; flow of control may briefly move
           where you did not expect it; some statements may not be executed
           because they compute constant results or their values are already
           at hand; some statements may execute in different places because
           they have been moved out of loops.

           Nevertheless it proves possible to debug optimized output.  This
           makes it reasonable to use the optimizer for programs that might
           have bugs.

gdb뿐만 아니라 -g 옵션을 사용하여 코드를 컴파일하면 Valgrinds memcheck 도구를 최대한 활용할 수 있는 가능성이 열립니다. 모르는 사람들을 위해 memcheck는 프로그래머가 코드에서 메모리 누수(있는 경우)를 확인하는 데 사용합니다. 여기에서 이 도구에 대해 자세히 알아볼 수 있습니다.

코드 프로파일링에 gprof를 사용하려면 -pg 명령줄 옵션을 사용하여 코드를 컴파일해야 합니다. 이를 통해 gcc는 코드 분석을 위해 gprof에 필요한 프로파일링 정보를 작성하기 위한 추가 코드를 생성할 수 있습니다. "데이터를 원하는 소스 파일을 컴파일할 때 이 옵션을 사용해야 하며 링크할 때도 사용해야 합니다." 당사 웹사이트의 전용 자습서입니다.

참고: -g-pg 옵션의 사용법은 이전 섹션에서 -save-temps 옵션을 사용한 방법과 비슷합니다.

결론

당신이 gcc 전문가가 아니라면 이 기사에서 새로운 것을 배웠을 것이라고 확신합니다. 이러한 옵션을 시도해보고 어떻게 작동하는지 확인하십시오. 한편, 이 튜토리얼 시리즈의 다음 부분에서 더 흥미롭고 유용한 gcc 명령줄 옵션에 대해 자세히 논의할 때까지 기다리세요.