Umstieg von Borland auf Visual C++ bereitet Probleme



  • 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 Variablen

    richtig?(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 Variablen

    extern 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 Variablen

    richtig?(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\IA64

    aber 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?
    Mondmann

    Ja 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...
    Mondmann

    Doch 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



  • Artchi schrieb:

    Die Warnungen für deprecated functions kann man auch abschalten. Weiß allerdings nicht wo. Müsste aber sicherlich in den Projekteinstellungen zu finden sein.

    Im Zweifelsfall hilft ein "#pragma warning(disable:4996)" am Anfang der betroffenen Datei.


Anmelden zum Antworten