Frage

Während der Compilierung mit avr-gcc I Linker Fehler wie die folgenden begegnet ist:

undefined reference to `__cxa_pure_virtual'

Ich habe festgestellt diesem Dokument , die besagt, :

  

Die __cxa_pure_virtual Funktion ist ein Fehler-Handler, der aufgerufen wird, wenn eine rein virtuelle Funktion aufgerufen wird.

     

Wenn Sie eine C ++ Anwendung schreiben, die rein virtuelle Funktionen können Sie Ihre eigene __cxa_pure_virtual Fehlerbehandlungsfunktion liefern müssen. Zum Beispiel:

     

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

Definition dieser Funktion wie vorgeschlagen behebt die Fehler, aber ich würde gerne wissen:

  • , was der Zweck dieser Funktion ist es,
  • warum sollte ich muss es definiere mich und
  • , warum es ist akzeptabel, es als eine unendliche Schleife zu codieren?
War es hilfreich?

Lösung

Wenn irgendwo in der Laufzeit des Programms ein Objekt mit einem virtuellen Funktionszeiger erstellt nicht ausgefüllt, und wenn die entsprechende Funktion aufgerufen wird, erhalten Sie eine ‚rein virtuelle Funktion‘ Aufruf sein.

Der Handler Sie beschreiben, sollten in den Standardbibliotheken definiert werden, die mit der Entwicklungsumgebung kommen. Wenn Sie die Standardbibliotheken weglassen passieren, werden Sie diese Prozedur nicht definiert finden: der Linker sieht eine Erklärung, aber keine Definition. Das ist, wenn Sie benötigen, um Ihre eigene Version zu liefern.

Die unendliche Schleife ist akzeptabel, weil es ein ‚lauten‘ Fehler sind: Benutzer der Software wird es sofort bemerken. Jede andere ‚lautet‘ Umsetzung ist akzeptabel, auch.

Andere Tipps

1) Was ist der Zweck der Funktion __cxa_pure_virtual ()?

reine virtuelle Funktionen können während des Objektbau / Zerstörung aufgerufen. Wenn das passiert, wird __cxa_pure_virtual () aufgerufen, den Fehler zu melden. Siehe Wo tun „rein virtueller Funktionsaufruf“ Abstürze kommen?

2) Warum müssen Sie möglicherweise, es selbst definieren?

Normalerweise wird diese Funktion durch libstdc bereitgestellt ++ (beispielsweise auf Linux), aber avr-gcc und den Arduino-Toolchain bietet keine libstdc ++.

Der Arduino IDE verwaltet die Linker-Fehler zu vermeiden, wenn einige Programme zu bauen, weil es mit den Optionen „-ffunction Schnitte -fdata Schnitte“ und Links mit kompiliert „-Wl, - gc Schnitte“, die einige Referenzen fällt um nicht verwendete Symbole.

3) Warum ist es akzeptabel, __cxa_pure_virtual zu kodieren () als Endlosschleife?

Nun, das ist zumindest sicher; es tut etwas vorhersehbar. Es wäre sinnvoller sein, das Programm abzubrechen und den Fehler zu melden. Eine Endlosschleife umständlich zu debuggen sein würde, obwohl, wenn Sie einen Debugger haben, die Ausführung unterbrechen und einen Stapel Backtrace geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top