Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Linkerfehler nach Umstieg von c auf c++

OwnerOfThisIsle / 1 Antworten / Baumansicht Nickles

Ich habe in Visual Studio 6 ein Beispielprojekt (tty ein Terminalprogramm für Kommunikation über die serielle Schnittstelle)  geöffnet.


Dann wollte ich ein paar MFC Features nutzen und hab darum das *.c File auf *.cpp umgeändert.


(Im Makefile war auch noch was umzustellen) Dann gab es eine Reihe Fehlermeldungen die ich alle durch Typecasts zum schweigen bringen konnte. Als das erledigt war tauchte ein Linker Fehler auf.


TTY.obj : error LNK2001: Nichtaufgeloestes externes Symbol "int __cdecl ProcessTTYCharacter(struct HWND__ *,unsigned char)" (?ProcessTTYCharacter@@YAHPAUHWND__@@E@Z)
TTY.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise



Was ist das nun wieder? Hab ich beim Umstieg was falsch gemacht? Oder macht das immer solche Probleme?
Kann jemand helfen, den Fehler auszubügeln oder gibt es ein Beispiel für serielle Kommunikation das schon auf MFC basiert?

bei Antwort benachrichtigen
mr.escape OwnerOfThisIsle „Linkerfehler nach Umstieg von c auf c++“
Optionen

Die funktion, die in c "ProcessTTYCharacter" hieß, heisst in c++ plötzlich "?ProcessTTYCharacter@@YAHPAUHWND__@@E@Z", weil dort nicht nur der reine funktionsname "ProcessTTYCharacter" sondern auch noch die parametertypen reinverschlüsselt sind. Der grund ist die fähigkeit von c++ mehrere funktionen mit gleichem namen aber unterscheidlichen parametertypen zu ermöglichen.
Z.b.:
foo(int i);
foo(float f);
foo(char c);
etc. sind in c++ möglich, in c aber nicht.
Beim linken wird nun plötzlich nicht der alte(kurze) sondern der neue, dekorierte name vorgefunden/gesucht. Das führt zum problem.
Die lösung ist eine anpassung des namens in allen betroffenen sourcecode teilen (d.h. verwendung der c++ version), bzw. bei vorhandener c-lib die rückstufung ins c format mit:

#ifdef __cplusplus

extern "C" {
#endif
int __cdecl ProcessTTYCharacter(struct HWND__ *,unsigned char);
#ifdef __cplusplus
}
#endif

in einem header file.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen