107 – GCC 옵션(자주 사용되는)

많은 옵션들 중에서 정리하고 싶은 옵션들을 리스트로 정리해보았다. 이젠 이 옵션들을 하나 하나 살펴보도록 하겠다. 내용은 최대한 간단하게 적고, 예시를 많이 보여주려고 하였기 때문에 은근 스크롤이 긴 편이다.

  • -o

C 코드를 컴파일할 때 생성되는 출력 파일 이름을 지정하는 옵션이다. 사용법은 다음과 같다.

스크린샷_2017-06-19_13-11-15.png

컴파일 할 파일과 옵션 순서를 바꿔도 똑같이 동작한다. 이전에 gcc의 작업 순서를 보여주기 위해서 다시 만들었던 hello world 소스코드이다. 아무 지정도 없었을 때에는 a.out이 나왔지만, -o 옵션을 통해 file이라는 파일이 만들어졌다. 이 파일을 실행하면 똑같이 hello world를 출력한다.

스크린샷_2017-06-19_13-11-28.png

-o 옵션을 생략하고 컴파일 하면 실행 파일 이름이 자동으로 a.out이 되는 것 외에도 주의해야 할 것이 있다. 두 가지 다른 소스를 차례로 컴파일할 때, 먼저 생성된 a.out을 덮어쓸 수 있다. 근데 이 작업이 경고 없이 그냥 막 덮어쓰게 된다. 앞에 예제들은 그런 거 신경 안쓰고 했었지만, 나중에 프로그램을 만들고 할 때에는 중요한 요소가 된다.

  • -E

앞에서 C 소스 파일을 컴파일하는 과정에 네 단계가 있고, 각 단계를 수동으로 조정할 수 있다고 했다. -E 옵션은 컴파일의 첫 단계인 전처리까지만 실행한 결과를 화면에 출력한다. 실제로 실행을 해본다. 아래처럼 뭔가 막 실행된 것을 볼 수 있다. 이게 전처리된 결과를 보는 것이다.

스크린샷_2017-06-19_13-16-22스크린샷_2017-06-19_13-16-29스크린샷_2017-06-19_13-16-38스크린샷_2017-06-19_13-16-47

-E 옵션만 주면 전처리된 결과가 화면에만 출력되고 파일로는 저장되지 않는다.

스크린샷_2017-06-19_13-18-41.png

그러므로 파일로 저장하려면 -o 옵션을 함께 주어야 한다. 그러면 전처리 결과를 디스크에 저장할 수 있다. 아래 예시가 실제로 실행한 결과다. 화면에는 보여주지 않고 그대로 파일로 저장했으며, 저장된 파일을 vi로 열어보니  이전에 출력된 것이 그대로 출력된다.

스크린샷_2017-06-19_13-20-00스크린샷_2017-06-19_13-20-15

  • -c

전처리, 컴파일, 어셈블까지 실행하여 오브젝트 파일(.o)을 생성한다. 이 오브젝트 파일은 나중에 실행 가능한 링킹 작업만 끝나면 되기 때문에 이 오브젝트만 가지고 gcc로 돌려도 실행 가능한 파일이 만들어진다. 우선 -c 옵션을 이용해서 오브젝트 파일을 만드는 것을 보도록 하자.

스크린샷_2017-06-19_13-56-46.png

file.o 파일이 만들어진 것을 확인할 수 있다. 이제 이 오브젝트로 실행 파일이 만들어져서 무사히 hello world가 찍히는지 확인해보도록 하자.

스크린샷_2017-06-19_13-57-20

a.out 파일을 지우고 그대로 file.o 파일을 가지고 컴파일을 완료한 후, 실행해보니 그대로 실행이 된다.

근데 이 옵션이 왜 필요한지 궁금한 사람들이 있을 것이다. 프로그램이 좀 커지고 프로젝트가 대형화 되어 수백, 수천 단위의 소스 파일을 컴파일 하는 경우에는 -c 옵션을 통해 하나의 프로그램을 여러 파일로 분리해 작성한 다음, 함께 컴파일하는 “분리 컴파일”을 할 때에 많이 이용된다. 즉, 왠만큼 규모가 커지게 되면 다 이용한다. 이걸 위해 간단한 예제를 하나 더 만들어보았다.

01 폴더 안에 main.c와 hi.c 파일을 작성하였다.

스크린샷_2017-06-19_14-22-20스크린샷_2017-06-19_14-22-50

이 두 파일을 컴파일 하는 것은, 앞의 예제에서 여러 파일을 컴파일하는 예제를 다룬 적이 있다. 이 둘을 함께 컴파일하는 것을 분리 컴파일이라 한다. 아래와 같이 하면 정상적으로 실행되는 것을 확인할 수 있다.

스크린샷_2017-06-19_14-23-47

그러나, 이 작업을 하나의 파일마다 각각 하게되면 오류가 발생한다. 당연히 서로가 참조해야 할 정의를 찾을 수 없어서 발생하는 것이다. hi랑 main 함수를 몾찾는 거다.

스크린샷_2017-06-19_14-26-18.png

하지만, 오브젝트까지만 만들어진 파일에 대해서는 나중에 링크를 할 수 있다. 링크가 진행되는 구조와 실행 결과는 아래와 같다.

20170606_050246766_iOS.jpg

스크린샷_2017-06-19_14-28-09

이 나중에 링크가 될 수 있는 기능 덕분에 여러 사람들이 자신이 개발한 작업 소스에 대해서 해당 소스만 수정하면 되는 그런 상황이 된다. 예를 들어, hi 함수에 기능을 수정하고 싶으면 hi만 수정해서 다시 오브젝트를 만들면, 나중에 수정된 오브젝트만 가지고 한번에 진행하면 된다. 그러면 main.c를 다시 컴파일 할 필요가 없어지므로 컴파일 시간도 줄어들게 된다.

20170606_050252076_iOS.jpg

스크린샷_2017-06-19_14-34-32스크린샷_2017-06-19_14-34-59

이 옵션은 make와 함께 쓰면 상당히 강력한 기능이 된다. make에 대한 설명을 할 때, 한번 더 다뤄보기로 한다.

-I

C 소스는 표준 디렉토리에 있는 헤더 파일을 이용하여 개발을 할 수도 있지만, 표준 디렉토리가 아닌 위치에 있는 레더 파일을 가져와서도 개발을 할 수 있다. 그 때 그 디렉토리의 위치를 지정해주는 옵션이다. 이 옵션 또한 예제를 보고 하면 금방 진행할 수 있다.

02라는 폴더에 예제를 만들어보았다. 그리고 예제의 구조 및 사용되는 소스코드를 먼저 작성해보고 시작한다.

20170606_050313772_iOS스크린샷_2017-06-19_14-40-06스크린샷_2017-06-19_14-39-39스크린샷_2017-06-19_14-40-24

myheader.h 파일에는 나이가 적혀있고, mydir 폴더 안에 들어있다.

이 상태에서 age.c 파일을 컴파일하면 myheader.h 파일이 없다는 오류가 나타난다.

스크린샷_2017-06-19_14-41-59.png

표준 디렉토리에 없기 때문에 오류가 발생한 것이다. 이제는 옵션을 주고 실행을 해보겠다.

스크린샷_2017-06-19_14-43-34

옵션에 해당되는 디렉토리의 위치를 지정해줬더니 바로 컴파일 오류가 나지 않는 것을 볼 수 있다.

이처럼 기본적으로 이용되는 옵션들에 대해서 예시와 함께 살펴보았다. 이 옵션들은 뒤에 더 많은 리눅스 개발 환경을 다루다보면 하나 둘은 반드시 보게 되는 기능들이기 때문에 이런 기능이 있다는 것은 꼭 알아야 하는 것들만 정리해보았다. 이제 다음에는 라이브러리 지정 옵션에 대해서 살펴보겠다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.