www.mikrocontroller.net

Forum: Compiler & IDEs pure virtual???


Autor:                              (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab mal wieder versucht, objektorientiert zu proggen. Leider klappt 
es nicht so wie es sollte. Beim folgendem Code bekomme ich 'ne 
Fehlermeldung:
class a
{
  public:
  virtual void mach()=0;
};

class b:public a
{
  public:
  void mach()
  {
  }
};

int main()
{
  b x;
  x.mach();
}
Und hier das Output vom Compiler:
> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C++: main.cpp
avr-gcc -c -mmcu=atmega32 -I. -x c++ -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-exceptions -Wall -Wa,-adhlns=obj/main.lst  -MD -MP -MF .dep/main.o.d main.cpp -o obj/main.o 
main.cpp:37: warning: alignment of 'b::_ZTV1b' is greater than maximum object file alignment.  Using 1
main.cpp:31: warning: alignment of 'a::_ZTV1a' is greater than maximum object file alignment.  Using 1

Linking: testpp.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o  -std=gnu99 -Wundef -MD -MP -MF .dep/testpp.elf.d obj/main.o --output testpp.elf -Wl,-Map=testpp.map,--cref    -lm
obj/main.o:(.data+0xa): undefined reference to `__cxa_pure_virtual'
make.exe: *** [testpp.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:00[/code]
Weiss jemand, was diesmal nicht klappt???

MfG Mark

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vom C++ her ist dein Code korrekt, ich würde darauf tippen, dass der 
std-lib vom AVR-G++ die Unterstützung für pure virtual funktionen fehlt 
(die er bei fn =0 einbindet, und die normalerweise eine assertion 
auslöst)
Deswegen der Linker-Fehler bei __cxa_pure_virtual.

Die anderen Fehler würd ich so deuten, das auch normale Virtuelle 
Funktionen nicht gehen. (Position in der VMT > max. position)

/Ernst

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe nirgends in der Kommandozeile, dass die libstdc++.(a,so) beim 
Linken benutzt wird.

In dieser Library steckt üblicherweise und laut Google-Suche das Symbol 
`__cxa_pure_virtual'.

Kann es sein, dass du ein unpassendes Makefile hast (vielleicht nur für 
C Projekte)?

Möglicherweise (wahrscheinlicherweise) gibt es auch keine Library 
libstdc++.(a,so) für die AVR Targets!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die alignment-Warnung ist harmlos. Die resultiert aus einem kleinen Bug 
im AVR-Target von GCC. Da wird aber trotzdem das richtige getan und die 
Warnung kann getrost ignoriert werden.
__cxa_pure_virtual ist die Funktion, die aufgerufen wird, wenn es durch 
einen Fehler im Programm zu einem Aufruf einer rein virtuellen Funktion 
käme. Da es keine C++-Standardlib für AVR-g++ gibt (und auch keine 
libsupc++), fehlt die Implmenentation dieser Funktion. Es sollte 
allerdings möglich sein, das zu korrigieren, indem man die Funktion 
einfach selbst schreibt. Sie kann dazu einfach leer sein oder auch eine 
Debug-Ausgabe irgendwo hinschreiben. Probier einfach mal ein:
void __cxa_pure_virtual()
{
}

ggf. noch mit einem extern "C" davor, falls er's immer noch nicht 
findet.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
der von rolf vorgschlagene workaround funktioniert bei mir ohne 
probleme.
/*!
 * \brief Pure-virtual workaround.
 *
 * The avr-libc does not support a default implementation for handling 
 * possible pure-virtual calls. This is a short and empty workaround for this.
 */
extern "C" {
  void __cxa_pure_virtual()
  {
    // put error handling here
  }
}

bye kosmo

Autor: Mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!!!

MfG Mark

Autor: isch_hap_dem_länksten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>class a
>{
>  public:
>  virtual void mach()=0;
>};

>class b:public a
>{
>  public:
>  void mach()
>  {
>  }
>};

>int main()
>{
>  b x;
>  x.mach();
>}

Wenn du virtuelle Methoden definierst, dann  sollten sie auch in den 
abgeleiteten Klassen virtuell sein - das geschieht zwar automatisch, 
aber du selbst oder Fremde werden beim Anblick deiner abgeleiteten 
Klasse keine Ahnung davon haben.

Autor: isch_hap_dem_länksten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber du selbst oder Fremde werden
einige Zeit später, versteht sich .... es sei denn du hast ein 
Supergedächtnis

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.