Problem mit Exception unter emedded visual c++ 4.0

Hallo,

ich habe bei embedded Visual C++ für Pocket PC folgendes Problem:
Bei nachfolgendem Code (in CPROGRAMDlg) erscheint eine Linker-Fehlermeldung:

 try
 {
 // Anweisungen
 }

 catch(CMyException \*pE)
 {
 // Fehlerbehandlung
 }

Fehlermeldung:

Linking...

PROGRAMDlg.obj : error LNK2001: unresolved external symbol "const type\_info::`vftable'" (??\_7type\_info@@6B@)

emulatorDbg/PROGRAM.exe : fatal error LNK1120: 1 unresolved externals

Error executing link.exe.

Die Klasse CMyException ist von CObject abgeleitet, und besteht momentan nur aus einem Konstruktor und Destruktor.
Ändere ich den catch-Teil wie folgt

catch(...)

so erhalte ich keine Fehlermeldung.

Weiss jemand Rat?
Vielen Dank.

Gruß,
Tom

Hallo Tom,

Fehlermeldung:
Linking…

PROGRAMDlg.obj : error LNK2001: unresolved external symbol
„const type_info::`vftable’“ (??_7type_info@@6B@)

emulatorDbg/PROGRAM.exe : fatal error LNK1120: 1 unresolved
externals

Error executing link.exe.

Die Klasse CMyException ist von CObject abgeleitet, und
besteht momentan nur aus einem Konstruktor und Destruktor.

Also der Linker hat eine Referenz auf ein Objekt oder eine Funktion offen, welche er in keiner Bibliothek finden kann.

Entweder hast du irgendwo einen Tippfehler in deiner Klasse. Es könnte auch noch sein, dass du eine Header-Datei nicht eingebunden hast.
Oder du hast vergessen dem Linker eine benötigtigte Bibliothek anzugeben. Es kann sein, dass diese Bibliothek von CObject benötigt wird.

MfG Peter(TOO)

Hallo zusammen,

sorry wegen der verspäteten Antwort.

Mittlerweile habe ich eine Lösung für das Problem gefunden, siehe
„Die RTTI-Bibliothek für das Pocket PC 2003-SDK ist verfügbar“ auf http://support.microsoft.com/default.aspx?scid=kb;%5… .

Zitat:
"Für C+±Ausnahmebehandlungscode, der „throw“-Konstrukte, „catch“-Konstrukte oder beides zusammen mit Datentypen verwendet, ist zum Identifizieren des Ausnahmetyps die RTTI-Unterstützung erforderlich. Ohne die RTTI-Bibliothek verursacht typisierter C+±Ausnahmebehandlungscode eine Linker-Fehlermeldung ähnlich der folgenden:

Fehler LNK2001: Nicht aufgelöstes externes Symbol „const type_info::‚vftable‘“ (??_7type_info@@6B@)"

Auf dieser Microsoft-Seite wird die RTTI-Bibliothek zum downloaden angeboten und erklärt wie sie in einem Pocket PC 2003-Projekt eingebunden wird.

Sehr empfehlenswerter Link.

Gruß,
Tom

Hallo Tom,

Zitat:
"Für C+±Ausnahmebehandlungscode, der „throw“-Konstrukte,
„catch“-Konstrukte oder beides zusammen mit Datentypen
verwendet, ist zum Identifizieren des Ausnahmetyps die
RTTI-Unterstützung erforderlich. Ohne die RTTI-Bibliothek
verursacht typisierter C+±Ausnahmebehandlungscode eine
Linker-Fehlermeldung ähnlich der folgenden:

Fehler LNK2001: Nicht aufgelöstes externes Symbol „const
type_info::‚vftable‘“ (??_7type_info@@6B@)
"

Aber Schlussendlich wir im Code eine Function aufgerufen, welche in keiner dem Linker bekannten, Bibliothek zu finden ist.

Gerade C++ kann da sehr „lustige“ Probleme erzeugen:

  1. Um Functionen und Operatoren überladen zu können, erzeugt der Compiler ein Label aus dem Functions-Namen und den Über- und Rückgabe-Parametern. Der Linker hat davon keine Ahnung, er sucht einfach ein passendes Einsprung-Label. Du brauchst also nur einen falschen Parameter-Typ beim Aufruf anzugeben und bekommst ein Linkermeldung diesen Typs.

  2. C++ erzeugt nur Code für benutzte Functionen, auch Templates könne da Überraschungen bieten. Nach Jahren wird in einem Projekt etwas geändert, z.B. ein DatenTyp von int aof long und der Linker bestraft dich mit Fehlermeldungen, weil die passende Function fehlt.

Hier scheint MS ein paar Aufrufe unter den angegebenen Umständen zu machen und hat scheinbar einfach vergessen diese Functionen auszuliefern :frowning:(

MfG Peter(TOO)