• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

컴파일 질문입니다

20.06.10 11:35 작성 조회수 473

1

우분투(Ubuntu 16.04.4)환경에서  리눅스IPC프로그래밍 실습을 하고 있습니다. 

mq_posix.c를 make로 컴파일 시도했지만

mq_posix.c:(.text+0x31): undefined reference to `mq_open'

mq_posix.c:(.text+0x75): undefined reference to `mq_getattr'

/tmp/cc5d8SvV.o: In function `do_send':

mq_posix.c:(.text+0x1a9): undefined reference to `mq_send'

/tmp/cc5d8SvV.o: In function `do_recv':

mq_posix.c:(.text+0x248): undefined reference to `mq_receive'

이런 오류가 나오면서 함수들을 찾지 못하더라구요 .

헤더파일들도 정상적으로 include 한 상태였는데도요.

구글링 해서 컴파일에 "-lrt"를 추가하면 된다고 해서

gcc -g -Wall -o mq_posix mq_posix.c -lrt

라는 명령으로 컴파일을 했더니 성공했습니다

원초적인 질문인거 같은데..

왜 선언한 헤더파일의 함수를 못 찾았고 lrt라는 명령으로 컴파일이 성공했는지 궁금합니다.

답변 1

답변을 작성해보세요.

1

우리가 흔히 컴파일이라고 부르는 작업은 컴파일 작업과 링크(link) 작업으로 구분할 수 있습니다. 컴파일 과정에서는 헤더 파일 등을 참고해 우리가 작성한 코드를 기계어로 바꿉니다. .o 파일이 그 산출물 입니다. 링크 작업은 우리의 .o 파일과 각종 라이브러리를 합쳐 하나의 실행 가능한 프로그램으로 만들어 줍니다. 코드에서 printf() 함수를 호출만 했지 구현한적이 없는데 어떻게 동작을 할까요? 바로 printf 함수는 gilbc 라는 라이브러리에 구현되어 있고, 링크 과정에서 우리의 printf() 호출이 코드가 glibc의 printf() 구현부를 연결하도록 해주기 때문에 동작을 하는 것 입니다.

mq_open() 등의 함수에서 발생한 컴파일 오류를 잘 보시면 "undefined reference" 에러 입니다. 참조할 곳이 없다는 말이죠. 즉, 헤더를 참조해 컴파일은 성공했지만, 링크 작업에서 연결할 함수의 구현부를 못찾겠다는 말 입니다. 그리고 -lrt를 추가한 것은 library rt를 링크 작업에 추가하라는 명령입니다. mq_open() 등의 함수가 librt에 구현되어 있기 때문에 링크 작업까지 성공하게 된 것 입니다.

간단히 정리를 해드렸는데 이해가 되실까요? 사실 이 과정은 굉장히 복잡한 과정입니다. 좀 더 자세한 내용은 compiler, linker, loader, shared library 등의 키워드로 구글링을 해보시길 추천드립니다.

좋은 질문 감사합니다 :D