Umstieg von Borland auf Visual C++ bereitet Probleme
-
Eigentlich sollte es in Visual Studio genauso funktionieren (wobei ich statt der dec.h die Deklarationen direkt ins Hauptmodul setzen würde).
Aber schau mal genau durch, ob auch wirlich ALLE Variablen mit "extern" gekennzeichnet wurden.(und geh ganz sicher, daß wirklich nur EINS deiner Module die dec.h einbindet)
-
Mondmann schrieb:
Die sind weitgehend identisch mit dem Unterschied daß in der extern.h jede deklaration und definition mit einem "extern" beginnt.
Sobald du definierst, wird das extern wirkungslos. Liegt es evtl daran? Da dürfen dann echt nur Deklarationen stehen.
-
Sobald du definierst, wird das extern wirkungslos. Liegt es evtl daran? Da dürfen dann echt nur Deklarationen stehen.
Also um mal festzustellen:
definieren tue ich Funktionen
deklarieren tue ich Variablenrichtig?(will mir nur nochmal sichergehen)
In diesem Falle wäre es falsch, da ich die Funktionensdefinitionen auch als extern habe.
Aber leider macht das keinen Unterschied, habs eben probiert.Aber schau mal genau durch, ob auch wirlich ALLE Variablen mit "extern" gekennzeichnet wurden.
(und geh ganz sicher, daß wirklich nur EINS deiner Module die dec.h einbindet)
Jo... des passt schon.
Fehlt da sonst noch was?
Irgend ne Lib oder so?
Die Meldung am Schluß:fatal error LNK1104: Datei "msvcirtd.lib" kann nicht geöffnet werden.
Was heißt das?
Schon klar was das heißt, aber wo ist die .lib?Mondmann
-
Mondmann schrieb:
Also um mal festzustellen:
definieren tue ich Funktionen
deklarieren tue ich Variablenextern int start_error;
Das ist eine Variablendeklaration. Du sagst dem Compiler "hey, irgendwo in den weiten meines Quellcodes gibt es eine Variable, die so heißt und diesen Typ hat. Das wo ist dem Compiler egal, dafür ist später der Linker zuständig.
extern int start_error = 0;
Auf den ersten Blick ein extern, also Deklaration, aber durch die Zuweisung braucht der Compiler ja nun ne konkrete Variable, weil das wo nicht mehr egal ist. Daher wird hier eine neue Variable in dieser Headerdatei wirklich angelegt, ist also eine Definition und nicht mehr identisch mit deiner anderen Variablendefinition. Die heißen halt gleich, sind aber 2 verschiedene Variablen.
-
Mondmann schrieb:
Sobald du definierst, wird das extern wirkungslos. Liegt es evtl daran? Da dürfen dann echt nur Deklarationen stehen.
Also um mal festzustellen:
definieren tue ich Funktionen
deklarieren tue ich Variablenrichtig?(will mir nur nochmal sichergehen)
Falsch: Definition/Deklaration hat nichts damit zu tun, was du in der Hand hast - in der FAQ findest du die Unterschiede und Feinheiten mal erklärt.
Die Meldung am Schluß:
fatal error LNK1104: Datei "msvcirtd.lib" kann nicht geöffnet werden.
Was heißt das?
Schon klar was das heißt, aber wo ist die .lib?Mondmann
*nachgeguckt hat* Die msvcirtd.lib enthält die "alte" iostream-Bibliothek (<iostream.h> und Kollegen) - eventuell solltest du deine Inlude-Direktiven umstellen auf <iostream> etc. (ohne das .h)
-
Ahja, das ist sehr interessant und ich dachte, daß es das ist, aber leider kommt der Fehler ( start_error und alle anderen) immer noch, wenn ich aus beiden header dateien die zuweisung start_error=0; rausmache.
also
int start_error
und
extern int start_error;
.
Mondmann
-
eventuell solltest du deine Inlude-Direktiven umstellen auf <iostream> etc. (ohne das .h)
hab ich gemacht, leider keinen Erfolg.
Muss ich noch irgendwelche Pfade anpassen?
Hab mal gesucht und diese lib ist in den folgenden 2 Verzeichnissen:
D:\Programme\Microsoft Platform SDK\Lib\AMD64 und
D:\Programme\Microsoft Platform SDK\Lib\IA64aber ich proggr doch auf X86?
hmmm....ich glaube irgendwo ist da ein grundsätzliches Problem.Mondmann
-
HM du hast auch die eine Datei im VC geändert udn die libs für das PSDK dort eingetragen? ODer hast du nur die include und lib Verzeichnisse bei dne Optionen angegeben?
-
acj ja und nachdem du jetzt das = 0 überall rausgemacht hast, hast du auch mal "ALles neu erstellen" probiert und nicht nur "Erstellen"? Das hilft auch manchmal
-
Alles neu erstellen: jetzt kommen noch mehr Fehler, aber alle gleicher Art:
Fehler 176 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. class.obj Fehler 177 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. class.obj Fehler 178 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. fkt.obj Fehler 179 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. fkt.obj Fehler 180 error LNK2005: "int __cdecl FKT_mallocerror(char *,char *,int,int)" (?FKT_mallocerror@@YAHPAD0HH@Z) ist bereits in fkt.obj definiert. funktionen.obj Fehler 181 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. funktionen.obj Fehler 182 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. funktionen.obj Fehler 183 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. kalender.obj Fehler 184 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. kalender.obj Fehler 185 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. offline.obj Fehler 186 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. offline.obj Fehler 187 error LNK2005: "char * log_buf" (?log_buf@@3PADA) ist bereits in funktionen.obj definiert. selbstauskunft.obj Fehler 188 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. selbstauskunft.obj Fehler 189 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. selbstauskunft.obj Fehler 190 error LNK2001: Nicht aufgelöstes externes Symbol ""int (__stdcall* FKT_comm)(char *,int,char *,int,unsigned int,char * *)" (?FKT_comm@@3P6GHPADH0HIPAPAD@ZA)". class.obj Fehler 191 error LNK2001: Nicht aufgelöstes externes Symbol ""int (__stdcall* FKT_comm)(char *,int,char *,int,unsigned int,char * *)" (?FKT_comm@@3P6GHPADH0HIPAPAD@ZA)". fkt.obj Fehler 192 error LNK2001: Nicht aufgelöstes externes Symbol ""int (__stdcall* FKT_comm)(char *,int,char *,int,unsigned int,char * *)" (?FKT_comm@@3P6GHPADH0HIPAPAD@ZA)". funktionen.obj Fehler 193 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_htons@4" in Funktion ""int __cdecl read_string(void)" (?read_string@@YAHXZ)". fkt.obj Fehler 194 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_connect@12" in Funktion ""int __cdecl FKT_offline(char *)" (?FKT_offline@@YAHPAD@Z)". fkt.obj Fehler 195 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_inet_addr@4" in Funktion ""int __cdecl FKT_offline(char *)" (?FKT_offline@@YAHPAD@Z)". fkt.obj Fehler 196 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_socket@12" in Funktion ""int __cdecl FKT_offline(char *)" (?FKT_offline@@YAHPAD@Z)". fkt.obj Fehler 197 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_recv@16" in Funktion ""int __cdecl FKT_offline(char *)" (?FKT_offline@@YAHPAD@Z)". fkt.obj Fehler 198 error LNK2001: Nicht aufgelöstes externes Symbol "_recv@16". kalender.obj Fehler 199 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_select@20" in Funktion ""int __cdecl FKT_offline(char *)" (?FKT_offline@@YAHPAD@Z)". fkt.obj Fehler 200 error LNK2001: Nicht aufgelöstes externes Symbol "_select@20". kalender.obj Fehler 201 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_closesocket@4" in Funktion ""int __cdecl FKT_offline(char *)" (?FKT_offline@@YAHPAD@Z)". fkt.obj Fehler 202 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_send@16" in Funktion ""int __cdecl FKT_offline(char *)" (?FKT_offline@@YAHPAD@Z)". fkt.obj Fehler 203 error LNK2001: Nicht aufgelöstes externes Symbol "_send@16". kalender.obj Fehler 204 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeSetEvent@20" in Funktion ""int __cdecl FKT_timer(char *)" (?FKT_timer@@YAHPAD@Z)". fkt.obj Fehler 205 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__MessageBoxA@16" in Funktion ""char * __cdecl FKT_lohnarten(char *,char *,char *,int,struct _EXTENSION_CONTROL_BLOCK *)" (?FKT_lohnarten@@YAPADPAD00HPAU_EXTENSION_CONTROL_BLOCK@@@Z)". fkt.obj Fehler 206 error LNK2001: Nicht aufgelöstes externes Symbol "__imp__MessageBoxA@16". selbstauskunft.obj Fehler 207 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WSAStartup@8" in Funktion ""int __cdecl startWSA(void)" (?startWSA@@YAHXZ)". funktionen.obj Fehler 208 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WSACleanup@0" in Funktion ""int __cdecl stopWSA(void)" (?stopWSA@@YAHXZ)". funktionen.obj Fehler 209 error LNK2001: Nicht aufgelöstes externes Symbol "_WSACleanup@0". selbstauskunft.obj Fehler 210 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WSAGetLastError@0" in Funktion ""void __cdecl SocketError(char *)" (?SocketError@@YAXPAD@Z)". funktionen.obj Fehler 211 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeEndPeriod@4" in Funktion "_TerminateExtension@4". selbstauskunft.obj Fehler 212 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeKillEvent@4" in Funktion ""void __stdcall callback_timer_back(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)" (?callback_timer_back@@YGXIIKKK@Z)". selbstauskunft.obj Fehler 213 fatal error LNK1120: 16 nicht aufgelöste externe Verweise. E:\vc++\Selbstauskunft.dll\Debug\Selbstauskunft.dll
HM du hast auch die eine Datei im VC geändert udn die libs für das PSDK dort eingetragen? ODer hast du nur die include und lib Verzeichnisse bei dne Optionen angegeben?
hm..mit dem ersten Satz weiß ich nicht genau was du meinst. Aber ich habe bei der Optionen->Verzeichnisse die libs, include und Quelldateien für das PSDK und mein Projekt abgegeben.
(D:\Programme\Microsoft Platform SDK\Lib)
Ist doch richtig, oder?
Mondmann
-
Mondmann schrieb:
hm..mit dem ersten Satz weiß ich nicht genau was du meinst. Aber ich habe bei der Optionen->Verzeichnisse die libs, include und Quelldateien für das PSDK und mein Projekt abgegeben.
(D:\Programme\Microsoft Platform SDK\Lib)
Ist doch richtig, oder?
MondmannJa aber da fehlt noch was.
Geht auf Hilfe->Gewusst wie,(is der erste Menupunkt, falls du die englische hast) Da müsste irgendwo stehen, wie man das PSDK vollständig einbindet.
Solange du aber keine Windows-Sachen verwendest, dürfte das den Fehler nicht verursachen, dass nur nebenbei.
-
..hab ich leider nicht gefunden und google auch nicht.
Da gibts eh so wenig zu vc++.
Ich nutze schon einige Windows Sachen, Sockets, zb.
ich glaub ich gebs bald auf, hat ja keinen Wert so...
MondmannDoch habs jetzt mal lesen, aber wie gesagt, das behebt die probleme nicht...
trotzeden vielen Dank mal.
-
Socket is WinAPI, da du die PSDK-Libs nicht drinnen hattest, kamen daher die Linkererrors!!
Zu dem anderen: irgendwo is in deiner Struktur noch der Wurm drin. Das lässt sich jetzt schlecht sagen wo genau. Aber evtl. siehst du jetzt auch, warum man globale Variablen nicht so exzessiv nutzen sollte^^
Wenn der Aufwand nicht zu groß ist mach dir ne Klasse für globale Variablen und alle Variablen darin statisch. Und dann bindest du überall halt die Klasse mit ein.
-
http://msdn.microsoft.com/visualc/learning/vcexpvids/default.aspx
DA sind Videos, da erste zeigt wie man den PSDK korrekt einbindet.
-
witzisch:-)
Aber so hab ichs gemacht...:-)
Ich lass es jetzt und arbeite mit dem Borland weiter, muss ja schließlich was tun, ne:)vielen Dank für Deine und Eure Hilfestellung, hab mal wieder was wichtiges dazugelernt.
Mondmann
-
ojeeeeeee..jetzt hab ich noch ne lib hinzugfügt, jetzt hab ich noch 9 Fehler:
Fehler 1285 error LNK2005: "int __cdecl FKT_mallocerror(char *,char *,int,int)" (?FKT_mallocerror@@YAHPAD0HH@Z) ist bereits in fkt.obj definiert. funktionen.obj Fehler 1286 error LNK2005: "char * log_buf" (?log_buf@@3PADA) ist bereits in funktionen.obj definiert. selbstauskunft.obj Fehler 1287 error LNK2001: Nicht aufgelöstes externes Symbol ""int (__stdcall* FKT_comm)(char *,int,char *,int,unsigned int,char * *)" (?FKT_comm@@3P6GHPADH0HIPAPAD@ZA)". class.obj Fehler 1288 error LNK2001: Nicht aufgelöstes externes Symbol ""int (__stdcall* FKT_comm)(char *,int,char *,int,unsigned int,char * *)" (?FKT_comm@@3P6GHPADH0HIPAPAD@ZA)". fkt.obj Fehler 1289 error LNK2001: Nicht aufgelöstes externes Symbol ""int (__stdcall* FKT_comm)(char *,int,char *,int,unsigned int,char * *)" (?FKT_comm@@3P6GHPADH0HIPAPAD@ZA)". funktionen.obj Fehler 1290 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeSetEvent@20" in Funktion ""int __cdecl FKT_timer(char *)" (?FKT_timer@@YAHPAD@Z)". fkt.obj Fehler 1291 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeEndPeriod@4" in Funktion "_TerminateExtension@4". selbstauskunft.obj Fehler 1292 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeKillEvent@4" in Funktion ""void __stdcall callback_timer_back(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)" (?callback_timer_back@@YGXIIKKK@Z)". selbstauskunft.obj Fehler 1293 fatal error LNK1120: 4 nicht aufgelöste externe Verweise. E:\vc++\Selbstauskunft.dll\Debug\Selbstauskunft.dll 1
Aber dafür hab ich 1284 Fehler:
die meisten lauten so:Warnung 20 warning C4996: 'strcpy' wurde als veraltet deklariert j:\httpd\selbstauskunft\src\ausgabe.cpp 600 Warnung 21 warning C4996: 'sprintf' wurde als veraltet deklariert j:\httpd\selbstauskunft\src\ausgabe.cpp 618 Warnung 22 warning C4996: 'strcmpi' wurde als veraltet deklariert j:\httpd\selbstauskunft\src\ausgabe.cpp 646
usw...
Was habe ich da Verstellt?
Mondmann
-
Also langsam habe ich das Gefühl, der VC++Express macht was er will.
Manchmal kommen o.g. Fehlermeldungen, dann wieder nicht, dann doch wieder...Ich denke den Express kann man abschreiben...
Mondmann
-
Mondmann schrieb:
Warnung 20 warning C4996: 'strcpy' wurde als veraltet deklariert j:\httpd\selbstauskunft\src\ausgabe.cpp 600 Warnung 21 warning C4996: 'sprintf' wurde als veraltet deklariert j:\httpd\selbstauskunft\src\ausgabe.cpp 618 Warnung 22 warning C4996: 'strcmpi' wurde als veraltet deklariert j:\httpd\selbstauskunft\src\ausgabe.cpp 646
usw...
Was habe ich da Verstellt?
Mondmann
Das ist ne Warnung, kein Fehler. Das sind alte C-Funktionen und potentiell unsicher(Bufferoverflow usw.). Dadrauf weist dich der Compiler nur hin.
Kann das sein, dass du einen sehr alten Borland C++ Builder hast?
Der neue VC ist halt, wie schon der Vorgänger, sehr standardkonform und lässt nicht alles durchgehen, was mit alten Compilern noch möglich ist. Is eigentlich positiv zu werten.
-
Die Warnungen für deprecated functions kann man auch abschalten. Weiß allerdings nicht wo. Müsste aber sicherlich in den Projekteinstellungen zu finden sein.
Ansonst: das Problem sitzt meisten nicht im sondern vorm Computer.
Der VC++ 2003 und 2005 sind schon sehr gute Compiler. Die verhalten sich halt so, wie es sein soll und die alten Compiler nicht getan haben. Man muß sich also schon intensiv mit dem ISO-C++ Standard auseinandersetzen, will man nicht immer Errors und Warning sehen.
-
Kann das sein, dass du einen sehr alten Borland C++ Builder hast?
Ja nicht den Builder, aber der Borland C++ 50.2. Der ist sehr alt, ja.
Es ist nur mal ein Versuch meinen Quellcode, der weitgehend ANSI und API zum VC++ portieren.
Da es sich hierbei um die kostenlose Express Version handelt kostets ja nichts.
Bei mir hats jetzt weitgehend funktioniert, außer dem benannten Fehler, bzw. Warnung der über tausendmal vorkommt.
Beim Kollegen der das tausendfache an Quelltext (oder noch mehr) hat kann mans vergessen vom Borland auf den VC++ unzusteigen.
Da ist viel Borlandspeizfisches drin (OWL usw)...Man muß sich also schon intensiv mit dem ISO-C++ Standard auseinandersetzen, will man nicht immer Errors und Warning sehen
..ja das bekomme ich gerade zu spüren:-))
Ich habe noch einiges gefunden, was der Borland locker durchgehen ließ, was sich aber als "echter" Fehler herausstellte.Danke für deine Hilfe und werd mal gucken was wir da machen.
Mondmann