프로그래밍 하다가 제일 난감한 경우 중에 하나가
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이라는 메세지를 만났을 때입니다.
다른 에러들은 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이 생기는 이유.|작성자 주의사신
'Programming Error' 카테고리의 다른 글
디버깅시에 브레이크포인트가 걸리지 않을때 (0) | 2013.06.21 |
---|---|
LNK2019 에러 (0) | 2013.05.27 |
Direct3DCreate9 관련 에러처리! (0) | 2013.05.14 |
처리되지 않은 예외 xxx 파일이나 어셈블리 xxx또는 여기에 종속 어쩌고 에러.. (0) | 2013.04.24 |