본문 바로가기
Programming Error

unresolved external symbol이 생기는 이유

by violetoz 2013. 5. 14.

 http://blog.naver.com/sainthkh/140074257990 
CCL
프로그래밍 하다가 제일 난감한 경우 중에 하나가 

unresolved external symbol이라는 메세지를 만났을 때입니다. 


다른 에러들은 F4나 더블 클릭으로 해당 위치로 이동을 해 주는 친절함을 보여주는 반면,

도대체 이 에러는 찾아 주지도 않는 매우 불성실함을 보이기 때문입니다. 


그러면 이 메세지가 어떤 때 등장하는지 알아보겠습니다. 

이 메세지가 생기는 근본적인 이유는 선언을 하고 정의를 하지 않았기 때문입니다. 

세가지 경우를 보겠습니다. 

1. 전역 함수 선언을 하고 정의하지 않은 경우.


foo.h------------------------------------------------------------------------------------

void bar();

-----------------------------------------------------------------------------------------

foo.cpp-----------------------------------------------------------------------------------
#include <stdio.h>
#include <foo.h>

void main()
{
    bar();
}
-----------------------------------------------------------------------------------------

bar()라는 함수가 foo.h에 선언이 되어 있습니다. 그런데 어디어서도 bar()에 대한 정의를 해 주지 않았습니다. 그런 경우 bar()라는 symbol이 해결되지 않았다(컴파일러가 난 이 함수는 도대체 뭔지 모르겠어라고 이야기하고 있다고 생각하시면 됩니다.)는 뜻입니다.


이 경우는 클래스에 대해서도 해당이 되는데,

foo2.h---------------------------------------------------------------------------------------

clase A
{
public:
    void bar();
};

----------------------------------------------------------------------------------------------

foo2.cpp--------------------------------------------------------------------------------------
#include <stdio.h>
#include "foo2.h"

void main()
{
    A a;
    a.bar();
}
-------------------------------------------------------------------------------------------------

이 경우 역시 foo.cpp에서와 같은 이유로 unresolved external symbol을 보게 됩니다. 


2. class에 static 변수를 선언하고 다시 class 밖에 선언하지 않은 경우 

이 경우에 대해서는 이 글을 참조하시기 바랍니다. -> 바로가기



3. 외부 라이브러리를 사용했을 때, lib 파일을 링크시키지 않았을 경우.

Windows 프로그래밍이나 기타 여러가지 프로그래밍을 할 경우 남이 만든 라이브러리를 가지고 와야 할 경우가 있습니다. 

그 때에 남이 만들어 준 헤더 파일은 잘 include했지만, 같이 따라온 lib 파일은 링크시키지 않아서 이런 문제가 발생합니다. 

이 경우 해당하는 lib 파일을 찾아서,

#pragma comment(lib, "somelib.lib")
을 적어주거나

Project -> Properties 또는 alt + F7을 누르고 Configuration Properties -> link -> input에 가셔서 Additional Dependencies에 필요한 lib파일을 적어 주시면 됩니다. 

unresolved external symbol이 생기는 이유 

[출처] unresolved external symbol이 생기는 이유.|작성자 주의사신