• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

main.o 파일을 생성하고 또 실행파일을 만드는 이유가 궁금합니다

23.03.09 15:24 작성 23.03.09 15:25 수정 조회수 996

1

main.c파일을 컴파일 해서 main.exe 파일이 만들어졌는데 이후에 main.o파일을 만들고 나서 왜 main.o에 대한 실행파일을 만드는 건지 궁금합니다

gcc -c main.c는 컴파일만 하고 실행파일은 생성이 안 되니까 실행파일을 더 만드는 것까진 알겠는데 왜 obj파일을 또 컴파일 해서 obj파일로 실행파일을 만드는지가 궁금합니다

  1. main.c를 컴파일 => main.exe

  2. main.c의 obj 파일 생성 => main.o

  3. main.o를 컴파일 => exe_from_obj.exe

이 중에 1,2번만 해도 obj파일과 exe파일이 생성된 것이니 더 생성해야될 파일이 없는 것이 아닌가요...?

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.03.09

안녕하세요, 답변 도우미 Soobak 입니다.

컴파일 과정과 링킹 과정에 대하여 혼란이 있으신 것 같아요!

우선, 이전 강의인 1.9 컴파일러와 링커 강의에서 학습하셨듯이,
C 언어에서 소스코드를 컴파일해서 실행파일을 생성하는 과정은 크게 두 단계로 나뉘어요.
다만, 1.9 컴파일러와 링커 강의 초반부에서 교수님께서 설명해주신 것 처럼, 두 단계를 하나의 단계로 뭉뚱그려 언급하는 관습적인 측면이 있습니다. ("컴파일러" 라고 부르지만, 컴파일러 뿐만 아니라, 링커까지 포함하는 경우가 많습니다.)

조금 더 자세히 설명드려보면 다음과 같습니다.

1.9 컴파일러와 링커 강의 초반에서 교수님께서 설명해주시듯, C언어와 같은 고수준 프로그래밍 언어로 작성된 소스코드는 컴파일러와 링커를 통해 기계어로 번역되어야만 컴퓨터에서 기능을 수행하게 됩니다.
이 때, 컴파일러와 링커가 하는 역할은 다음과 같아요.

  1. 컴파일 단계

    • 컴파일러는 소스코드 파일을 번역하여 오브젝트 파일을 생성합니다. (질문자님께서 말씀하신 obj 파일!)

    • 이 때, 오브젝트 파일은 기계어 코드는 아니지만, 기계어와 좀 더 가까운 어셈블리 코드(assembly code) 혹은 중간 코드(intermediate code) 등으로 이루어져 있어요. 즉, 아직 기계어 코드가 아닙니다.

  2. 링킹 단계

    • 링커가 오브젝트 파일들 간의 의존 관계들을 분석해서 하나의 실행파일로 합쳐줍니다.

    • 이 때 최종적으로 기계어 코드로 변환되어 실행파일이 만들어지는 것이에요.

여기서, gcc - c-ccompile 의 약자인데요. 이름에서도 알 수 있듯, -c 옵션은 컴파일러가 소스코드를 컴파일하는 과정만을 수행하게 되어 최종 프로그램이 아닌, 오브젝트 파일만이 생성됩니다.

따라서, 해당질문자님의 질문에서 1, 2, 3 으로 나누신 부분은 해당 강의에서 교수님께서 각각
1. gcc 에서 아무 옵션 없이 컴파일을 진행했을 때
2. gcc-c 옵션을 주어 오브젝트 파일을 생성하는 것
3. gcc-o 옵션을 사용하여 output 의 이름을 지정하는 방법
에 대하여 설명해주시는 것 입니다.

즉, 1번과 2번 과정을 통해 실행 파일과 오브젝트 파일을 만들고 또 실행파일을 만드는 것은 gcc 의 역할과 옵션들에 대한 설명인 것이에요. 각 단계가 질문자님께서 질문하신 것처럼 프로그램을 생성하기 위해서 실행파일을 컴파일하고, 오브젝트 파일을 만들고, 또 실행파일을 만드는 것이 아닌 것이지요. 의도에 있어서 조금 혼동이 있으셨던 것 같습니다.

컴파일과 링킹과정에은 처음 프로그래밍을 접하는 입장에서 조금 어려우실 수 있으신 내용이니 걱정마셔요! 이어서 강의를 수강하시다보면 교수님께서 틈틈히 링킹에러를 비롯하여 링킹과정에 대해 추가적으로 설명해주십니다. 😁

추가적으로, 비슷한 질문이 있어서 공유 드려보아요!
따배씨 링킹 관련 교수님께서 답변해주신 다른 질문

또 궁금하신 부분 있으시면 편하게 댓글 남겨주세요. 감사합니다. 화이팅!! 👍

 

sara0099님의 프로필

sara0099

질문자

2023.03.09

답변 감사합니다! 답변 주신 것 바탕으로 이해한 걸 정리 해보자면

  1. 컴파일: 소스코드 파일을 번역하여 obj파일 생성

  2. 링킹: obj파일들을 합쳐서 실행파일 만듦

질문의 1, 2, 3은 실행파일을 만드는 과정을 설명한 것이 아닌 각각 터미널 명령어의 기능(?)들을 소개한 것이니까 따로따로 이해하면 됨

이정도인 것 같은데 아직 궁금한 것은

gcc main.c -o main.exegcc main.o -o main.exe차이입니다.

구체적으로 main.c를 컴파일 하여 생성된 main.exe 파일과, main.o를 컴파일 하여 생성된 main.exe(강의 내용으로 치면 exe_from_obj.exe)의 차이가 무엇인지 궁금합니다.

Soobak님의 프로필

Soobak

2023.03.09

안녕하세요, 이해하신 내용은 맞습니다!

추가로 주신 질문에 대해 답변드려보면,
gcc main.c -o main.exegcc main.o -o main.exe 로 생성된 main.exe 파일의 차이는 없습니다. 같은 기능을 수행하는 프로그램입니다! 😁( main.o 파일이 main.c 파일로부터 생성되었으니까요!)

궁금한 점이 있으시면 또 편하게 댓글 남겨주셔요. 감사합니다.