GCC 옵션 · 3 min read · Jan 22, 2026
드물지만 유용한 GCC 명령줄 옵션
소프트웨어 도구는 일반적으로 여러 기능을 제공하지만, 대부분의 여러분이 동의하듯이 모든 기능이 모든 사용자에게 사용되는 것은 아닙니다. 일반적으로, 그럴 수 있는 것은 잘못된 것이 없으며, 각 사용자는 자신의 요구 사항에 따라 도구를 사용합니다. 그러나 사용 중인 도구를 계속 탐색하는 것은 항상 좋은 일입니다. 언제 어떤 기능이 유용할지 모르기 때문입니다.
예를 들어, 컴파일러입니다. 좋은 프로그래밍 언어 컴파일러는 항상 많은 옵션을 제공하지만, 사용자는 일반적으로 제한된 세트만 알고 사용합니다. 특히, C 언어 개발자이고 Linux를 개발 플랫폼으로 사용하는 경우, gcc 컴파일러를 사용하고 있을 가능성이 높습니다. gcc는 끝없는 명령줄 옵션 목록을 제공합니다.
gcc가 컴파일 프로세스의 각 단계에서 출력을 저장하도록 요청할 수 있다는 것을 알고 계셨나요? 경고를 생성하기 위해 사용하는 -Wall 옵션이 특정 경고를 포함하지 않는다는 것을 알고 계셨나요? 일반적으로 사용되지 않지만 특정 시나리오에서 매우 유용할 수 있는 많은 gcc 명령줄 옵션이 있습니다. 예를 들어, 코드를 디버깅할 때 유용합니다.
따라서 이 기사에서는 이러한 옵션 몇 가지를 다루고 필요한 모든 세부 정보를 제공하며, 필요한 경우 이해하기 쉬운 예를 통해 설명하겠습니다.
하지만 진행하기 전에, 이 튜토리얼에서 언급된 모든 예제, 명령 및 지침은 Ubuntu 16.04 LTS에서 테스트되었으며, 우리가 사용한 gcc 버전은 5.4.0이라는 점을 기억해 주시기 바랍니다.
각 컴파일 단계에서 중간 출력 보기
gcc 컴파일러를 사용하여 C 코드를 컴파일할 때, 코드가 거치는 단계가 총 네 단계라는 것을 알고 계셨나요? 이 단계는 전처리, 컴파일, 어셈블리 및 링크입니다. 각 단계 후에 gcc는 다음 단계로 전달되는 임시 출력 파일을 생성합니다. 이제 이러한 모든 파일은 임시 파일이므로 우리는 그것들을 볼 수 없습니다. 우리가 보는 것은 컴파일 명령을 발행했으며 실행할 수 있는 바이너리/실행 파일이 생성되었다는 것입니다.
하지만 디버깅 중에 전처리 단계 이후 코드가 어떻게 보였는지 확인해야 한다면, 어떻게 하시겠습니까? 좋은 점은 gcc 컴파일러가 표준 컴파일 명령에서 사용할 수 있는 명령줄 옵션을 제공하여 컴파일러가 그렇지 않으면 삭제하는 중간 파일을 얻을 수 있다는 것입니다. 우리가 이야기하는 옵션은 -save-temps입니다.
다음은 이 옵션에 대한 gcc 매뉴얼 페이지의 설명입니다:
일반 "임시" 중간 파일을 영구적으로 저장합니다; 현재 디렉토리에 배치하고 소스 파일을 기반으로 이름을 지정합니다. 따라서 -c -save-temps로 foo.c를 컴파일하면 foo.i, foo.s 및 foo.o 파일이 생성됩니다. 이는 컴파일러가 이제 일반적으로 통합 전처리기를 사용하더라도 전처리된 foo.i 출력 파일을 생성합니다.
-x 명령줄 옵션과 함께 사용하면 -save-temps는 중간 파일과 동일한 확장자를 가진 입력 소스 파일을 덮어쓰지 않도록 충분히 합리적입니다. 해당 중간 파일은 -save-temps를 사용하기 전에 소스 파일의 이름을 바꿈으로써 얻을 수 있습니다.다음은 이 옵션을 사용하는 방법에 대한 예제 명령입니다:
gcc -Wall -save-temps test.c -o test-exec그리고 위의 명령이 실행된 후 모든 중간 파일이 실제로 생성되었는지 확인한 방법은 다음과 같습니다:

위 스크린샷에서 볼 수 있듯이, test.i, test.s, test.o 파일이 -save-temps 옵션에 의해 생성되었습니다. 이 파일들은 각각 전처리, 컴파일 및 링크 단계에 해당합니다.
코드 디버깅 및 프로파일링 준비
소스 코드를 디버깅하고 프로파일링할 수 있는 전용 도구가 있습니다. 예를 들어, gdb는 디버깅 목적으로 사용되며, gprof는 프로파일링 목적으로 인기 있는 도구입니다. 그러나 gcc가 코드 디버깅 및 프로파일링 준비를 위해 제공하는 특정 명령줄 옵션이 있다는 것을 알고 계셨나요?
디버깅부터 시작하겠습니다. gdb를 사용하여 코드 디버깅을 하려면 gcc 컴파일러가 제공하는 -g 명령줄 옵션을 사용하여 코드를 컴파일해야 합니다. 이 옵션은 기본적으로 gcc가 gdb가 프로그램을 성공적으로 디버깅하는 데 필요한 디버깅 정보를 생성하도록 허용합니다.
이 옵션을 사용할 계획이라면, gcc 매뉴얼 페이지에서 제공하는 세부 정보를 살펴보는 것이 좋습니다. 일부 정보는 특정 경우에 매우 중요할 수 있습니다. 예를 들어, 다음은 매뉴얼 페이지에서 발췌한 내용입니다:
GCC는 -O와 함께 -g를 사용할 수 있습니다. 최적화된 코드에서 취한 단축키는 때때로 놀라운 결과를 초래할 수 있습니다: 선언한 일부 변수는 전혀 존재하지 않을 수 있으며; 제어 흐름이 예상치 못한 곳으로 잠시 이동할 수 있습니다; 일부 문장은 상수 결과를 계산하거나 그 값이 이미 손에 있기 때문에 실행되지 않을 수 있습니다; 일부 문장은 루프에서 이동했기 때문에 다른 위치에서 실행될 수 있습니다.
그럼에도 불구하고 최적화된 출력을 디버깅하는 것이 가능합니다. 이는 버그가 있을 수 있는 프로그램에 대해 최적화기를 사용하는 것이 합리적임을 의미합니다.gdb뿐만 아니라, -g 옵션을 사용하여 코드를 컴파일하면 Valgrind의 memcheck 도구를 완전히 활용할 수 있는 가능성도 열립니다. memcheck는 프로그래머가 코드에서 메모리 누수를 확인하는 데 사용됩니다. 이 도구에 대해 더 알고 싶다면 여기를 클릭하세요.
다음으로, gprof를 사용하여 코드 프로파일링을 하려면 -pg 명령줄 옵션을 사용하여 코드를 컴파일해야 합니다. 이 옵션은 gcc가 gprof가 코드 분석에 필요한 프로파일링 정보를 작성하기 위해 추가 코드를 생성하도록 허용합니다. “데이터를 원하는 소스 파일을 컴파일할 때 이 옵션을 사용해야 하며, 링크할 때도 이 옵션을 사용해야 합니다,”라고 gcc 매뉴얼 페이지는 말합니다. gprof를 사용하여 코드 프로파일링을 수행하는 방법에 대해 더 알고 싶다면, 저희 웹사이트의 전용 튜토리얼을 확인하세요.
참고: -g 및 -pg 옵션의 사용은 이전 섹션에서 -save-temps 옵션을 사용한 방식과 유사합니다.
결론
당신이 gcc 전문가가 아니라면, 이 기사를 통해 새로운 것을 배웠을 것이라고 확신합니다. 이러한 옵션을 시도해 보시고, 어떻게 작동하는지 확인해 보세요. 한편, 이 튜토리얼 시리즈의 다음 부분을 기다려 주세요. 그곳에서는 더 많은 흥미롭고 유용한 gcc 명령줄 옵션에 대해 논의할 것입니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.