반응형
컴파일(정확히는 링크)을 할 때 아래와 같은 에러를 종종 보곤 한다.
unresolved symbol이라는 에러는 말 그대로 해당 심볼명을 찾을 수 없다는 에러이다.
이런 에러가 났을 때, 우리가 해야 할 일은
[ 내가 만든 함수인 경우 ]
1. unresolved symbol이 뜬 곳에서 함수명, 인자의 타입, 개수, 반환값등을 확인한다.
2. 해당 함수를 포함한 파일이 컴파일 되는지 확인한다.
매크로등에 의해 컴파일에 포함되지 않을 수도 있기 때문이다.
쉽게 확인하는 방법의 하나는 해당 함수에 #error를 넣고 컴파일해보는 것이다.
컴파일 에러가 아니라, unresolved symbol이 또 뜬다면, 그 함수는 컴파일에 포함되지 않은것이다.
3. C함수인지 C++함수인지 확인한다.
C++로 컴파일 할 때, C함수(C로 컴파일되는 파일에 있는 함수)를 처리하려면 헤더파일에는 extern "C" { }안에 함수가 선언되어 있어야 한다.
만약 헤더파일에서 이러한 처리가 제대로 안되어 있다면 C++은 해당 함수의 이름을 C++형태로 추적하려 한다.
[ 남이 만든 함수인 경우(라이브러리에서 참조하는 경우) ]
4. 3번과 같이 헤더파일에 제대로 선언되어 있는지 확인한다.
5. 라이브러리 파일안에 해당 함수가 있는지 파일 내부를 검색한다.(grep같은 것을 이용하여)
6. 컴파일 할 때, 해당 라이브러리가 포함되는지 확인한다.
리눅스의 경우 -L의 라이브러리의 경로가 맞게 포함되어 있는지, -l로 해당 라이브러리가 첨부되어 있는지 확인해야 한다.
unresolved symbol이라는 에러는 말 그대로 해당 심볼명을 찾을 수 없다는 에러이다.
이런 에러가 났을 때, 우리가 해야 할 일은
[ 내가 만든 함수인 경우 ]
1. unresolved symbol이 뜬 곳에서 함수명, 인자의 타입, 개수, 반환값등을 확인한다.
2. 해당 함수를 포함한 파일이 컴파일 되는지 확인한다.
매크로등에 의해 컴파일에 포함되지 않을 수도 있기 때문이다.
쉽게 확인하는 방법의 하나는 해당 함수에 #error를 넣고 컴파일해보는 것이다.
컴파일 에러가 아니라, unresolved symbol이 또 뜬다면, 그 함수는 컴파일에 포함되지 않은것이다.
3. C함수인지 C++함수인지 확인한다.
C++로 컴파일 할 때, C함수(C로 컴파일되는 파일에 있는 함수)를 처리하려면 헤더파일에는 extern "C" { }안에 함수가 선언되어 있어야 한다.
만약 헤더파일에서 이러한 처리가 제대로 안되어 있다면 C++은 해당 함수의 이름을 C++형태로 추적하려 한다.
[ 남이 만든 함수인 경우(라이브러리에서 참조하는 경우) ]
4. 3번과 같이 헤더파일에 제대로 선언되어 있는지 확인한다.
5. 라이브러리 파일안에 해당 함수가 있는지 파일 내부를 검색한다.(grep같은 것을 이용하여)
6. 컴파일 할 때, 해당 라이브러리가 포함되는지 확인한다.
리눅스의 경우 -L의 라이브러리의 경로가 맞게 포함되어 있는지, -l로 해당 라이브러리가 첨부되어 있는지 확인해야 한다.
반응형
'프로그래밍 언어 > C&C++' 카테고리의 다른 글
gcc 업그레이드 (4.5.0) (0) | 2010.07.21 |
---|---|
Header안에 static 변수 (0) | 2010.02.21 |
디버깅하는 법 - 툴 - ltrace (0) | 2010.02.18 |
[Python]파일명 바꾸기 (0) | 2009.09.02 |
AspectC++ (0) | 2009.08.31 |