문제

AVR-GCC로 컴파일하는 동안 다음과 같은 링커 오류가 발생했습니다.

undefined reference to `__cxa_pure_virtual'

내가 찾았 어 이 문서 어떤 상태 :

그만큼 __cxa_pure_virtual 함수는 순수한 가상 함수가 호출 될 때 호출되는 오류 처리기입니다.

순수한 가상 기능이있는 C ++ 응용 프로그램을 작성하는 경우 자신의 __cxa_pure_virtual 오류 핸들러 기능. 예를 들어:

extern "C" void __cxa_pure_virtual() { while (1); }

이 기능을 제안 된대로 정의하면 오류가 수정되지만 알고 싶습니다.

  • 이 기능의 목적은 무엇인지,
  • 내가 직접 정의 해야하는 이유
  • 무한 루프로 코딩하는 것이 허용되는 이유는 무엇입니까?
도움이 되었습니까?

해결책

프로그램 런타임의 어느 곳에서나 가상 함수 포인터가 채워지지 않고 해당 함수를 호출하면 '순수한 가상 함수'를 호출하게됩니다.

설명하는 처리기는 개발 환경과 함께 제공되는 기본 라이브러리에 정의되어야합니다. 기본 라이브러리를 생략하면이 핸들러가 정의되지 않은 것을 찾을 수 있습니다. 링커에는 선언이 표시되지만 정의는 없습니다. 그때 자신의 버전을 제공해야합니다.

무한 루프는 '큰 소리'오류이기 때문에 허용됩니다. 소프트웨어 사용자가 즉시 알 수 있습니다. 다른 '큰'구현도 허용됩니다.

다른 팁

1) 함수의 목적은 __cxa_pure_virtual ()의 목적은 무엇입니까?

객체 구성/파괴 중에 순수한 가상 기능이 호출 될 수 있습니다. 이 경우 __cxa_pure_virtual ()가 오류를보고하도록 호출됩니다. 보다 "Pure Virtual Function Call"충돌은 어디에서 발생합니까?

2) 왜 직접 정의해야합니까?

일반적 으로이 함수는 libstdc ++ (예 : Linux)에서 제공하지만 AVR-GCC와 Arduino 도구 체인은 libstdc ++를 제공하지 않습니다.

Arduino IDE는 옵션 "-ffunction-sections -fdata-spections"와 "-wl, -gc sections"와 연결되기 때문에 일부 프로그램을 구축 할 때 링커 오류를 피하기 위해 관리합니다. .

3) 왜 __cxa_pure_virtual ()을 무한 루프로 코딩하는 것이 허용되는 이유는 무엇입니까?

글쎄, 이것은 적어도 안전합니다. 그것은 예측 가능한 일을합니다. 프로그램을 중단하고 오류를보고하는 것이 더 유용합니다. 그러나 실행을 방해하고 스택 백 트레이스를 제공 할 수있는 디버거가 없다면 무한 루프는 디버그에 어색합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top