본문 바로가기

트러블슈팅/짧

[짧은 트러블슈팅] 링커오류 잡기 260225

개요

개발 중에 발생했던 간단한 혹은 헷갈리는 문제들을 정리하면 개념정립에 도움이 될거같아 이 카테고리를 만들어보았습니다.

일반적으로 Windows에서 네트워크 코드를 작성하기 위해 

#pragma comment(lib, "Ws2_32.lib")

를 사용해야한다는 것을 대부분 알고 있을 것입니다.

 

오늘 잠시 까먹고 넣지 않으니 위와 같은 링크오류가 발생했습니다.

 

일반적으로 헤더를 include하면 함수들에 대한 사용은 그냥 이루어졌었는데, 왜 소켓 라이브러리는 별도로 라이브러리를 가져와야 할까요?


컴파일과 링크

C환경에서 build를 할 때는 compile -> link 순으로 이루어집니다.

컴파일을 하면, 컴파일러가 파일을 번역해 obj파일로 만듭니다.

 

그리고 linker가 obj파일들을 보고, 실제로 사용된 심볼을 골라 exe파일에 포함하며, dll의 함수를 사용하는 경우 링크과정에서 DLL 함수에 대한 심볼을 exe에 추가합니다.

 

프로젝트 내의 .h에서 선언된 파일에 대한 정의를 .cpp에 구현했다면 같은 프로젝트 내에 있기 때문에 심볼을 찾을 수 있습니다.

 

그렇다면 위의 링커오류는 함수에 대한 정의가 외부에 있으며 이에 대한 심볼을 찾을 수 없다는 것을 확인할 수 있습니다.

 

따라서 

#pragma comment(lib, "Ws2_32.lib")

소켓 라이브러리를 포함한다는 표시가 필요합니다.


하지만 일반적으로 이렇게 굳이 추가하지는 않았습니다.

왜 이번에는 필요할까요?

 

실제로는 기본적인 헤더들에 대한 라이브러리는 기본적으로 포함하고 있습니다.

 

프로젝트 설정의 추가 종속성을 찾아보면 기본적인 종속성 라이브러리들을 가져오는 것을 확인할 수 있습니다.

 

결론적으로 일반적으로 사용하는 헤더들에 대한 구현 라이브러리 파일들도 가져오고 있으며, 필요한 경우 추가를 해야된다는 것입니다.