Umstieg von Borland auf Visual C++ bereitet Probleme
-
Hallo Community und erst mal ein "Hallo".
Ich habe bisher mit dem Borland C++5.02 geproggt.
Es dreht sich dabei um ISAPI-DLLS für unsere Kunden.
Da es jetzt VC++ Express gibtm habe ich mir das gezogen und das SDK gedowloadet.Habe erst mal mit men kleinen Projekt abgefangen und habe damit riesige Probleme, was im Borland durchgeht, gibt hier Fehler.
Was ist nicht verstehe ist folgende Ausgabe des Linkers:Fehler 1 error LNK2005: "int start_error" (?start_error@@3HA) ist bereits in ausgabe.obj definiert. class.obj Fehler 2 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. class.obj Fehler 3 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. class.obj Fehler 4 error LNK2005: "int start_error" (?start_error@@3HA) ist bereits in ausgabe.obj definiert. fkt.obj Fehler 5 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. fkt.obj Fehler 6 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. fkt.obj Fehler 7 error LNK2005: "int __cdecl FKT_mallocerror(char *,char *,int,int)" (?FKT_mallocerror@@YAHPAD0HH@Z) ist bereits in fkt.obj definiert. funktionen.obj Fehler 8 error LNK2005: "int start_error" (?start_error@@3HA) ist bereits in ausgabe.obj definiert. funktionen.obj Fehler 9 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. funktionen.obj Fehler 10 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. funktionen.obj Fehler 11 error LNK2005: "int start_error" (?start_error@@3HA) ist bereits in ausgabe.obj definiert. kalender.obj Fehler 12 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. kalender.obj Fehler 13 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. kalender.obj Fehler 14 error LNK2005: "int start_error" (?start_error@@3HA) ist bereits in ausgabe.obj definiert. offline.obj Fehler 15 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. offline.obj Fehler 16 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. offline.obj Fehler 17 error LNK2005: "char * log_buf" (?log_buf@@3PADA) ist bereits in funktionen.obj definiert. selbstauskunft.obj Fehler 18 error LNK2005: "int start_error" (?start_error@@3HA) ist bereits in ausgabe.obj definiert. selbstauskunft.obj Fehler 19 error LNK2005: "struct HINSTANCE__ * hWterm" (?hWterm@@3PAUHINSTANCE__@@A) ist bereits in ausgabe.obj definiert. selbstauskunft.obj Fehler 20 error LNK2005: "int OFFLINE" (?OFFLINE@@3HA) ist bereits in ausgabe.obj definiert. selbstauskunft.obj Fehler 21 fatal error LNK1104: Datei "[b]msvcirtd.lib[/b]" kann nicht geöffnet werden. Selbstauskunft
Woran kann das liegen? Kann mir wer helfen?
Danke schonmal Mondmann
-
ist bereits in ausgabe.obj
usw.
Da wird wo min. doppelt includiert. benutze mal
#pragma once
am Anfang jeder Headerdatei. Das verhindert sowas. ZU beachten ist, dass das MS VC spezifisch ist. Wenn du es C++ standardmäßig haben willst, musst mit ifndef usw. arbeiten. oder halt die Stelle suchen, wo der include zuviel ist.
-
Du hast da drei mehrfach deklarierte Variablen, mit denen der Borland-Linker offenbar toleranter umgegangen ist als sein MS-Kollege - ich tippe auf eine Definition im Header.
Verlagere mal die Definition von start_error, hWterm und OFFLINE aus dem Header in eine der verwendeten CPP-Dateien, dann sollte es eigentlich funktionieren. (im Header benötist du nur eine Deklaration "extern int start_error;" etc.)
-
hmmmm...
das ist aber seltsam.
Mein Projekt ist so aufgebaut, daß ich ein Haupmodul haupt.cpp und viele untermodule habe.
Die deklarationen und definitionen sind in 2 Dateien:
dec.h und extern.hDie dec.h wird inder haupt.cpp includiert und die extern.cpp in jedem anderen Modul.
Die sind weitgehend identisch mit dem Unterschied daß in der extern.h jede deklaration und definition mit einem "extern" beginnt.
Damit sagte ich dem Borland daß es diese definition schon, gibt aber habs so trotzdem "bekannt gemacht" sonst meckerte er.Wie kann man das mit VC++ machen?
haupt.cpp ->dec.h
unter1.cpp - extern.h
unter2.cpp - extern.h
unterX.cpp - extern.husw.
zB. start_error (und alle anderen)ist definitiv NUR in dec.h und extern.h deklariert.
#pragma once
bringt leider nichts.
Danke für Eure Hilfe Mondmann
-
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