Forum: Compiler & IDEs C++ Fehler bei abstraktenn Basisklassen


von Stefan (Gast)


Lesenswert?

Hallo,

da mein derzeiiges Projekt etwas Umfangreicher wird, möchte ich es
gerne in C++ programmieren. Dank der neuen Version von mfile klappt das
prinzipiell recht gut mit dem WinARM.
Der Linker erzeugt aber eine Fehlermeldung, sobald eine abstrakte
Basisklasse im Spiel ist:
1
class A
2
{
3
  public:
4
    virtual void test() = 0;
5
};
6
7
class B: public A
8
{
9
  public:
10
    void test();
11
};
12
13
void B::test()
14
{
15
}
16
17
int main()
18
{
19
  B hallo;
20
}

Die Fehlermeldung lautet:
undefined reference to `__cxa_pure_virtual'

Übersetzt klingt das für mich so, als ob dem Linker die Implementierung
der rein virtuellen Funktion fehlt. Aber natürlich liegt es in der Natur
von rein virtuelen Funktionen, dass diese keine Implementierung haben.
Im Übrigen meldet der C++ Compiler beim kompilieren folgende Warnung:
alignment of 'B::_ZTV1B' is greater than maximum object file
alignment.  Using 1

Hat das vielleicht damit etwas zu tun ?
Oder ist soetwas mit avrgcc einfach nicht möglich, wie z.B. auch das
Instanziieren zur Laufzeit mit new ?

Gruß
Stefan

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
mein kenntnisstand dazu ist, das die avr-libc das __cxa_pure_virtual
bisher nicht mitbringt.

der behelf sieht so aus:

extern "C" {
  void __cxa_pure_virtual()
  {
    // put error handling here
  }
}

funktioniert bei mir ohne probleme. mit der fehlermeldung zum alignment
hat das nichts zu tun, denke ich.

hth, kosmo

von Stefan (Gast)


Lesenswert?

Welche Linker-Flags hast du benutzt?
http://gcc.gnu.org/ml/gcc-help/2003-07/msg00097.html

Und in welcher Reihenfolge?
http://brewforums.qualcomm.com/showthread.php?t=11919&goto=nextnewest

"Note you still have to satisfy this
// __cxa_pure_virtual for the linker, however -- either with a
// do-nothing function, or in the linker script, or with ld's
--defsym
// switch."
http://brew.wardco.com/BREWe2modFilter.cpp
http://brewforums.qualcomm.com/showthread.php?t=11919&goto=nextnewest

Der Weg über die Dummy-Funktion ist OK...

"About __cxa_pure_virtual [...]: The compiler generates these by
itself and they need to be satisfied. Qualcomm provides a module called
GCCResolver.o to do this, or you can just define them in your code.
__cxa_pure_virtual needs to do nothing."
http://brew.wardco.com/index.html

von Stefan (Gast)


Lesenswert?

Der Warnung auf den Grund zu gehen ist anscheinend aufwändiger.

Man findet mit Teilen der exakten Fehlermeldung einige Bugreports und
Fixes bgzl. GCC allerdings für andere Targets.

Um abzuklären, ob bei WinARM sowas vorliegt, müsste man die Definition
der Konstante MAX_OFILE_ALIGNMENT zum Zeitpunkt der Übersetzung des
WinARM-Pakets kontrollieren und ggf. den Compiler neu übersetzen.

von Joe D. (kosmonaut_pirx)


Lesenswert?

meine linker-flags .. ma besten mal da schauen, sind dank Makefile
immer die gleichen
http://www.mikrocontroller.net/forum/read-2-418972.html#new

aber wie der eine beitrrag in deinen links schon sagt, ist das eine
funktion für den fall, dass doch mal eine virtuelle funktion aufgerufen
wird.
solange es so funktioniert, stört's mich nicht weiter. ist vll was für
die request-liste der avr-libc.

von Stefan (Gast)


Lesenswert?

@ joe die (kosmonaut_pirx)

sorry, ich wollte den Originalposter (Stefan - steseegmx.net) fragen
bzw. darauf anspitzen in der Richtung zu suchen.

von Joe D. (kosmonaut_pirx)


Lesenswert?

da habe ich euch verwechselt, entschuldigung.

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.