undefined symbol error는 흔히 어떤 함수를 사용하려고 하는데,
실제 함수의 구현체가 없는 경우에 linking 하는 과정에서 발생하는 에러입니다.
개발자가 보기에는 에러가 발생안해야 하는데, 이상하게 발생한다고 느껴지는 경우들이 종종 있습니다.
몇가지 경우를 살펴봅시다.
1) header file에만 해당 함수가 정의되어있고 구현부가 없는 경우,
만약 바이너리(binary)로 되어있는 lib과 h 파일을 사용하는 경우, lib안에 해당 함수가 구현이 안되어있을 것입니다.
2) binary에도 구현이 되어있는데, 안되는 경우,
binary 가 so또는 dll 과 같이 shared lib으로 만들어졌을때에, 해당 함수가 export안되어 있어서, 외부에서는 사용할 수 없는 경우입니다.
3) 구현도 되어있고 export 되어있는 경우,
c 로 작성된 함수여서 cpp 파일에서 사용하려고 할때 naming 이 mangling 되어 문제가 발생할 수 있습니다.
ex) void abcd(int a) 라는 함수가 c로 작성된 API명은 _abcd 라는 symbol을 제공하는데,
cpp에서 include 해서 사용하려다 보니 _abcdi 와 같은 전혀 다른 이름으로 호출이 되어 발생할 수 있습니다.
extern "C" 로 해결이 가능한 부분입니다.
원인은 대부분 이 3가지 경우들에 포함될것 입니다.
이 와 관련 내용으로 아래 링크에 따로 정리되어 있습니다.
C++ 상에서 발생하는 name mangling 에 관한 내용
<참고>
undefined symbol error와 관련해서 색다른 사용법과 회피 방법이 있습니다.
프로젝트를 진행하다보면,
build 환경에는 symbol이 없고, 실행 환경에만 library가 있다거나 symbol이 있다거나 하는 경우들이 발생합니다.
이럴 경우, build 시점에 undefined symbol error들이 발생하는데,
이를 회피 하고자 할때 사용하는 방법이
link option에서 undefined symbol을 무시하는 방법이 있습니다.
linux 의 ld 옵션 https://linux.die.net/man/1/ld
ld 옵션 중에 --allow-shlib-undefined 가 있습니다.
link option에 --allow-shlib-undefined 를 주게 되면, undefined symbol이 발생하더라도, build error 를 발생시키지 않고
바이너리를 만들어내게 됩니다.
부득이한 경우에 회피할 수 있는 방법이긴 하나, 전체적으로 보면 이는 좋은 방법은 아닙니다.
이 옵션이 켜진 상태로 프로젝트를 진행하다보면, 실제로 함수구현이 빠진 부분을 발견하지 못하고 넘어갈 수도 있습니다.
그렇게 되면 원인을 찾는데 매우 큰 시간이 들게 됩니다.
'Linux' 카테고리의 다른 글
relro,Stack Canary 방어 (0) | 2018.06.05 |
---|---|
tput: no value for $term 에러 발생 (0) | 2017.11.21 |
open 되어있는 fd 확인하기. (0) | 2017.03.03 |
프로세스의 메모리 사용량 (0) | 2017.01.11 |
rpm 사용법 (0) | 2014.02.13 |