C++에서 Class::Function()에 대한 정의되지 않은 참조

Muhammad Husnain 2023년10월12일
  1. C++의 오류 유형
  2. C++에서 Class::Function()에 대한 정의되지 않은 참조
  3. C++에 함수 정의가 없기 때문에 Class::Function()에 대한 정의되지 않은 참조 해결
  4. C++에서 연결되지 않은 개체 파일로 인한 Class::Function()에 대한 정의되지 않은 참조 해결
  5. C++에서 컴파일되지 않은 종속 파일로 인한 Class::Function()에 대한 정의되지 않은 참조 해결
C++에서 Class::Function()에 대한 정의되지 않은 참조

이 튜토리얼은 C++ 프로그래밍에서 가장 일반적이고 똑같이 치명적인 오류 중 하나(예: Class::Function()에 대한 정의되지 않은 참조)에 대해 간략하게 설명합니다.

먼저 C++로 코딩할 때 발생하는 다양한 오류에 대해 간략하게 설명합니다. 그런 다음 정의되지 않은 참조 오류의 원인과 수정 사항에 대해 설명합니다.

C++의 오류 유형

C++ 코드는 다른 프로그래밍 언어와 마찬가지로 여러 가지 이유로 오류나 버그가 발생할 수 있습니다. 이러한 오류는 다음 오류 범주로 크게 분류됩니다.

  • 구문 오류는 C++ 규칙 또는 구문 위반으로 인해 발생하는 오류입니다.
  • 런타임 오류는 구문상 프로그래밍 문제가 없지만 실행 시 감지되어 프로그램 충돌로 이어지는 경우에 발생하는 오류입니다.
  • 논리적 오류는 원하는 결과 또는 출력을 얻지 못할 때 발생합니다. 이는 프로그램 논리에 오류가 있음을 의미합니다.
  • 링커 오류는 프로그램이 성공적으로 컴파일되고 다른 개체를 기본 개체 파일과 연결하려고 하므로 실행 파일이 생성되지 않을 때 발생하는 오류 유형입니다. 예를 들어, 정의된 함수의 잘못된 프로토타입, 잘못된 헤더 파일 포함 등

C++에서 Class::Function()에 대한 정의되지 않은 참조

이것은 C++에서 가장 자주 발생하는 오류이며 특히 새 프로그래머에게 똑같이 중요합니다. 이러한 유형의 링커 오류는 프로그램 실행에 영향을 줄 수 있습니다.

이러한 오류는 주로 프로그램이 성공적으로 컴파일되고 다른 개체 파일을 주 개체와 연결하려는 연결 단계에 있을 때 발생합니다. 프로그램이 일부 출력을 제공하는 경우가 있는데 이 오류가 발생합니다.

따라서 이러한 오류를 추적하고 수정하는 것이 때때로 복잡합니다.

정의되지 않은 참조 오류는 일부 클래스, 함수 또는 변수에 대한 참조를 사용할 때 발생합니다. 링커는 연결된 모든 개체 파일 및 라이브러리에서 해당 정의를 찾을 수 없으므로 Undefined Reference to a Class::Function() 오류가 생성됩니다.

이러한 오류의 원인은 여러 가지가 있을 수 있지만 여기서는 그 중 일부에 대해 설명합니다.

C++에 함수 정의가 없기 때문에 Class::Function()에 대한 정의되지 않은 참조 해결

이것이 이 오류의 가장 직접적인 이유일 수 있습니다. 함수의 프로토타입을 제공했지만 정의를 제공하는 것을 잊었기 때문입니다.

해당 함수에 대한 참조를 생성하면 링커가 해당 정의를 찾지 못하여 Undefined Reference to a Class::Function() 오류가 생성됩니다.

이는 아래 예에서 보여줍니다.

#include <iostream>
class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box

  double getArea(void);
};
int main() {
  Square sq1;
  sq1.getArea();
  return 0;
}

출력:

(.text+0x15): undefined reference to Square::getArea()
collect2.exe: error: ld returned 1 exit status

C++에서 연결되지 않은 개체 파일로 인한 Class::Function()에 대한 정의되지 않은 참조 해결

다른 파일을 사용하여 클래스를 정의하는 경우 프로그램을 연결할 때 주 목적 파일과 연결될 주 함수 파일에 해당 파일을 포함해야 합니다.

아래 예에서는 Square 클래스를 다른 파일에 별도로 정의했습니다. 기본 파일에서 해당 개체를 참조하고 있으므로 파일이 링크되지 않아 정의되지 않은 참조 오류가 발생합니다.

예시:

#include <iostream>
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

예(Square.cpp):

class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box
  double getArea(void) { return length * width; }
  void setLength(double l) { length = l; }
};

이 문제에 대한 해결책은 Square.cpp 파일을 다음 코드의 기본 파일에 링크하는 것입니다.

#include <iostream>

#include "square.cpp"
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

C++에서 컴파일되지 않은 종속 파일로 인한 Class::Function()에 대한 정의되지 않은 참조 해결

이 유형의 오류는 프로그램의 모든 종속성이 성공적으로 컴파일되지 않은 경우에도 발생합니다. 링커가 실행 파일을 성공적으로 생성하려면 연결 단계를 시작하기 전에 모든 종속성을 컴파일해야 합니다.

이는 링커가 모든 종속 개체 파일(즉, .o 파일)을 쉽게 찾을 수 있도록 하기 위해 불가피합니다. 종속 개체 파일이 누락되면 링커는 정의되지 않은 참조 오류를 생성합니다.

메모
GNU의 g++ 컴파일러를 사용하는 경우 Bash 명령 g++ -c abc.cpp는 링커를 호출하지 않고 해당 개체 파일 abc.o를 생성합니다.

위에서 논의한 상황 외에도 정의되지 않은 참조 오류에 대한 다른 많은 상황이 있을 수 있습니다. 프로그래머는 이러한 문제를 피하기 위해 모든 식별자(예: 함수, 변수 및 개체)를 올바르게 정의해야 합니다.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

관련 문장 - C++ Error