본문 바로가기
컴퓨터/디버깅

undefined reference to

by adnoctum 2010. 5. 18.

다음과 같은 에러가 났다.

환경: GCC 4.1.2 20080704 (Red Hat 4.1.2-46) on CentOS 5.4

[adnoctum@bioism analysis_code]$ make
g++ -o analyse_path_corr2 analyse_path_corr2.o /home/adnoctum/LJSLibrary/library/util.o
analyse_path_corr2.o: In function `process(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)':
analyse_path_corr2.cpp:(.text+0xc1d): undefined reference to `rank_z_alpha_from_value(std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> > const&, double*, double*, double*, double*)'
collect2: ld returned 1 exit status
make: *** [analyse_path_corr2] Error 1


문제의 핵심은 다음 줄이다.

analyse_path_corr2.cpp:(.text+0xc1d): undefined reference to `rank_z_alpha_from_value(std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> > const&, double*, double*, double*, double*)'

즉, 현재 링커인 ld가 링크를 하면서 rank_z_alpha_from_value(...) 함수를 찾으려고 했는데 찾지 못한 것이다. 이것은 예전의 Visual C++에서의 unresoved external symbol 과 같은 류의 문제이다. 그렇다면 왜 이런 일이 발생했을까? make를 실행시 수행된 가장 첫 번째 명령어를 보면,

g++ -o analyse_path_corr2 analyse_path_corr2.o /home/adnoctum/LJSLibrary/library/util.o

인데, 여기에는 rank_z_alpha_from_value 함수가 선언되어 있는 statutil.o 파일이 없다. 즉, VC++의 *.lib에 해당하는 파일인 *.o 파일 - 함수의 본체가 선언되어 있는 파일 - 이 gcc에 입력으로 주어지지 않은 것이다. 따라서 링커는 임시로 대체해 놓았던 rank_z_alpha_from_value 함수를, 입력으로 주어진 그 어느 오브젝트 파일에서도 찾지 못했기 때문에 정의되지 않은 것을 사용하려 했다는 에러 메세지를 내고 있는 것이다.

해결책은 간단하다.

g++ -o analyse_path_corr2 analyse_path_corr2.o /home/adnoctum/LJSLibrary/library/util.o /home/adnoctum/LJSLibrary/library/statutil.o

처럼 statutil.o 를 입력으로 넣어 주면 된다.



ps. 이 경우 에러가 생긴 이유는 코딩 중간에 statutil.h 파일에 정의되어 있는 함수를 사용하게 되어 include 시켰는데, make 파일을 수정하지 않아서 생긴 것이다. 각 cpp 파일의 include를 조사해서 make 파일을 자동으로 만드는 스크립트를 만들어 사용하고 있기 때문에 위 문제는 사실 그 스크립트를 한 번 실행시킨 것으로 해결되었다. ㅋ