Forum: Compiler & IDEs pure virtual???


von                              (Gast)


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:
1
class a
2
{
3
  public:
4
  virtual void mach()=0;
5
};
6
7
class b:public a
8
{
9
  public:
10
  void mach()
11
  {
12
  }
13
};
14
15
int main()
16
{
17
  b x;
18
  x.mach();
19
}
Und hier das Output vom Compiler:
1
> "make.exe" all
2
3
-------- begin --------
4
avr-gcc (GCC) 3.4.6
5
Copyright (C) 2006 Free Software Foundation, Inc.
6
This is free software; see the source for copying conditions.  There is NO
7
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8
9
10
Compiling C++: main.cpp
11
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 
12
main.cpp:37: warning: alignment of 'b::_ZTV1b' is greater than maximum object file alignment.  Using 1
13
main.cpp:31: warning: alignment of 'a::_ZTV1a' is greater than maximum object file alignment.  Using 1
14
15
Linking: testpp.elf
16
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
17
obj/main.o:(.data+0xa): undefined reference to `__cxa_pure_virtual'
18
make.exe: *** [testpp.elf] Error 1
19
20
> Process Exit Code: 2
21
> Time Taken: 00:00[/code]
Weiss jemand, was diesmal nicht klappt???

MfG Mark

von Εrnst B. (ernst)


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

von Stefan B. (stefan) Benutzerseite


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!

von Rolf Magnus (Gast)


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:
1
void __cxa_pure_virtual()
2
{
3
}

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

von kosmonaut pirx (Gast)


Lesenswert?

hallo,
der von rolf vorgschlagene workaround funktioniert bei mir ohne 
probleme.
1
/*!
2
 * \brief Pure-virtual workaround.
3
 *
4
 * The avr-libc does not support a default implementation for handling 
5
 * possible pure-virtual calls. This is a short and empty workaround for this.
6
 */
7
extern "C" {
8
  void __cxa_pure_virtual()
9
  {
10
    // put error handling here
11
  }
12
}

bye kosmo

von Mork (Gast)


Lesenswert?

Danke!!!

MfG Mark

von isch_hap_dem_länksten (Gast)


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.

von isch_hap_dem_länksten (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.