[C++] undefined reference to 해결법

국혜경·2022년 6월 21일
2
post-thumbnail

VScode를 이용해 C++ 프로그래밍 중에 undefined reference to 에러를 만났다. 꽤나 오래 구글링을 해봐도 해결법을 찾을 수 없었어서... 혹시 나와 같은 이유로 해당 에러를 만난 사람들에게 도움이 되고자 글을 쓴다.


1. 문제 상황

undefined reference to `Graph::LoadMatrix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
undefined reference to `Graph::GetSize()'
undefined reference to `Graph::PrintShortestPathWeight(int)'

g++컴파일러로 컴파일시 위와 같은 에러가 발생 하는 것을 확인 할 수 있다.

디렉터리 구조는 위와 같았으며, graph.h 헤더파일에서 정의한 함수를 graph.cpp에서 구현하여 main.cpp에서 사용하는 구조였다.




2. 원인을 찾는 과정

구글링해본 결과 이러한 종류의 'undefined reference to'에러의 원인은 크게 아래와 같았다.

1. 코딩 과정의 실수

  • 헤더파일을 include하지 않음
  • .h에 선언만 해놓고 .cpp에 구현하지 않음
  • namespace를 알맞게 지정해주지 않음 ex) Graph::GetSize()

2. 저장하지 않고 컴파일 시도해서 오류 발생
3. .cpp에서 .c에 정의된 함수를 Call


하지만 확인 결과 나의 경우에는 3가지 모두 해당되지 않았고 아래와 같은 상황이 발생했다.
(1) 헤더파일, 구현부, main.cpp파일을 나누지 않고 컴파일 할 때는 정상적으로 컴파일 되었다.
(2) 헤더파일, 구현부, main.cpp가 나누어져 있는 상황에서도 아래와 같이 콘솔창에서 직접 컴파일 할 시에는 멀쩡히 컴파일 되었다.

g++ -o graph.exe main.cpp graph.cpp

소스코드들이 위치한 디렉터리에서 위 명령어를 실행하니 graph.exe 실행파일이 만들어지며 컴파일이 잘 된것을 확인할 수 있었다.




3. 원인 & 해결법

원인: tasks.json의 "args"부분이 잘못 됨.

- 해결법

VScode와 같은 IDE는 결국 위와 같은 컴파일 명령을 자동화 시켜서 컴파일이 이루어지게 한다. VScode의 tasks.json파일은 그 자동화를 위한 문서이고, 이 문서의 "args"에 쓰여진대로 컴파일 명령을 실행한다. 이곳에 잘못된 명령어가 써있으니 제대로 컴파일이 되지 않았던 것이다.

나는 처음 VScode를 설치했을 때 구글링해서 찾은 tasks.json을 그대로 복사해와서 사용했고, 그 파일의 "args"부분은 아래와 같았다.

g++ -o graph.exe main.cpp graph.cpp과 같이 컴파일 명령이 실행되게 하기 위해서, 해당 부분을 아래와 같이 수정하였다.

다시 컴파일 시도해본 결과 아래처럼 정상적으로 진행됨을 확인 할 수 있다.






4. 마치며

개발환경 셋팅을 할 때 무작정 복사+붙여넣기를 할게 아니라 해당 기능/문서가 어떤 일을 하게 되는지, 컴파일과 실행은 어떻게 이루어지는지를 알아 둘 필요가 있다는 사실을 알게 되었다. 특히 VScode의 tasks.json파일에 써있는 것들에 대해 공부할 필요가 있어보인다. 누군가에게 도움이 되었길 바라며 글을 마친다.

0개의 댓글