링크를 잘못하면 발생하는 문제다.
보통
- 스펠링 실수
- 라이브러리 링킹 문제
- C/C++ extern 문제
- gcc -L, -I 옵션 실수
- 함수의 공개 범위문제
등이 있다.
스펠링 실수는… 흠…
라이브러리 링킹 문제는 필요한 라이브러리를 링크하지 않았을 때 생긴다. 예를 들어 리얼타임을 사용할 때 -lrt 옵션을 추가하는 것을 의미한다.
C/C++ extern 문제는 C 파일과 C++ 파일을 혼합해서 링킹할 때 생기는 문제이다.
C로 작성된 함수들에 대해 C로 작성되었다는 것을 extern을 통해 알려야 한다. (extern “C”)
이는 C++이 C와 다른 함수 규격을 사용하기 때문이다. (Name Mangling)
물론 extern을 했다고 해서 C 함수를 C++처럼 사용할 수 있는건 아니다.
gcc 옵션 실수는 좀 골때리는 실수이다.
예를 들어 gcc … -L -lm 등으로 빌드를 할 때
L 옵션 이후에 패스 지정이 없어서 -lm이 -L의 인자로 들어가게 된다.
이 경우 -lm 옵션은 없어지게 된다.
Makefile 생각없이 썼다가 겪을 수 있는 봉변 중 하나이다.
함수의 공개 범위 문제는
static으로 선언되어있는 함수를 외부 소스파일에서 끌어다쓸 때 생기는 문제이다.
헤더파일에는 함수가 명시되어있으므로 컴파일은 되겠지만,
static으로 선언이 되어있기 때문에 외부에서는 해당 함수를 찾을 수 없다.
결국 Undefined Reference가 되는 것이다.