mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

class A
{
  public:
    virtual void test() = 0;
};

class B: public A
{
  public:
    void test();
};

void B::test()
{
}

int main()
{
  B hallo;
}


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

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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=11...

"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=11...

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ joe die (kosmonaut_pirx)

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

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da habe ich euch verwechselt, entschuldigung.

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.