C++ Fehler bei abstraktenn Basisklassen

Gast #412044
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
#412045
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
Gast #412046
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
Gast #412047
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.
#412048
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.