>백엔드 개발 >C++ >GCC C에서 '가상 테이블 및 생성자에 대한 정의되지 않은 참조' 링커 오류가 발생하는 이유는 무엇입니까?

GCC C에서 '가상 테이블 및 생성자에 대한 정의되지 않은 참조' 링커 오류가 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-18 08:49:10436검색

Why Am I Getting

GCC C 링커 오류: 가상 테이블 및 생성자에 대한 정의되지 않은 참조

C에서 가상 함수를 사용하면 파생 클래스가 해당 클래스에 정의된 메서드를 재정의할 수 있습니다. 기본 수업. 가상 함수를 사용하는 프로그램을 링크할 때 링커에서는 이러한 메서드 정의가 개체 파일에 있어야 합니다. 이러한 정의를 제공하지 않으면 다음과 같은 정의되지 않은 참조 오류가 발생합니다.

  • 'XXX용 vtable'에 대한 정의되지 않은 참조
  • 'ClassName::ClassName()'에 대한 정의되지 않은 참조

가능 원인

이러한 오류는 다음을 포함한 다양한 이유로 발생할 수 있습니다.

  1. 정의 없이 재정의된 가상 함수: 앞에서 언급한 대로 모든 가상 함수에는 다음이 있어야 합니다. 이를 사용하는 최종 클래스의 정의. 하위 클래스에서 가상 함수를 선언했지만 정의하지 않으면 링커는 정의되지 않은 참조 오류를 보고합니다.
  2. 누락된 헤더 파일: 클래스가 포함된 헤더 파일 정의는 이를 사용하는 소스 파일에 제대로 포함되지 않을 수 있습니다.
  3. 잘못된 라이브러리 연결: 사용 중인 클래스의 구현이 포함된 올바른 라이브러리에 연결

정적 라이브러리 및 클래스 가용성 확인

  1. 라이브러리 비트: 정적 라이브러리가 64비트인지 확인하려면 다음 파일을 사용하세요. 명령:

    file -L <library_path>

    라이브러리가 64비트인 경우 64비트 x86-64 공유 객체를 표시해야 합니다.

  2. 클래스 가용성: objdump -t 명령을 사용하여 라이브러리에 특정 항목이 포함되어 있는지 확인합니다. class:

    objdump -t <library_path> | grep <class_name>

    클래스가 있으면 출력에 나열됩니다.

예제 문제

제공된 오류 로그에 표시된 것처럼 SomeClass::close()에 대한 정의되지 않은 참조는 클래스가 사용되었지만 정의되지 않았음을 나타냅니다. 마찬가지로 SomeOtherClass에 대한 SomeClass::SomeClass() 및 vtable에 대한 정의되지 않은 참조는 SomeOtherClass 클래스의 생성자와 가상 테이블이 개체 파일에 정의되어 있지 않음을 나타냅니다.

해결책

이 문제를 해결하려면 모든 가상 함수가 적절한 하위 클래스에 정의되어 있는지, 필요한 헤더 파일이 포함되어 있는지, 올바른 라이브러리가 프로그램입니다.

위 내용은 GCC C에서 '가상 테이블 및 생성자에 대한 정의되지 않은 참조' 링커 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.