Probleme mit dem Visual Debug Mode

Topsen

Mitglied
Hallo,

ich habe ein Problem mit dem Visual Debugger. Ich habe eine Standard SDI Anwendung generiert und mit der MFC einige Dialoge und FormViews erstellt.

Im weiteren Verlauf wollte ich nun Standard C++ Klassen aus einem seperaten Programm einbinden. Wenn ich sie eingebunden habe, bekomme ich mehrere Linkerfehler. Ich habe gelesen, dass ich in jede Klasse die stdafx.h includen muss damit es geht.
Nachdem ich dies getan habe, bekomme ich diese LinkerFehler:

error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (?3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)

Ich habe in den Projekt Settings mal in den Linkeroptions /verbose:lib hinzugefügt und bekomme folgenden Output:

Compiling...
Compiling resources...
.....
Linking...
Searching libraries
Searching ALXGridD.lib:
Searching ...\Vc7\atlmfc\lib\nafxcwd.lib:
Searching ...\Vc7\lib\libcmtd.lib:
Searching ...\Vc7\lib\kernel32.lib:
Searching ...\Vc7\PlatformSDK\lib\user32.lib:
Searching ...\Vc7\PlatformSDK\lib\gdi32.lib:
Searching ...\Vc7\PlatformSDK\lib\msimg32.lib:
Searching ...\Vc7\PlatformSDK\lib\comdlg32.lib:
Searching ..\Vc7\PlatformSDK\lib\winspool.lib:
Searching ..\Vc7\PlatformSDK\lib\advapi32.lib:
Searching ...\Vc7\PlatformSDK\lib\shell32.lib:
Searching ...\Vc7\PlatformSDK\lib\comctl32.lib:
Searching ...\Vc7\PlatformSDK\lib\shlwapi.lib:
Searching ...\Vc7\PlatformSDK\lib\uuid.lib:
Searching ...\Vc7\PlatformSDK\lib\oledlg.lib:
Searching ...\Vc7\PlatformSDK\lib\ole32.lib:
Searching ...\Vc7\PlatformSDK\lib\oleaut32.lib:
Searching ...\Vc7\PlatformSDK\lib\urlmon.lib:
Searching ...\Vc7\lib\libcpmtd.lib:
Searching ...\Vc7\lib\OLDNAMES.lib:
Searching ...\Vc7\lib\libcimtd.lib:
libcimtd.lib(cerrinit.obj) : error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
libcimtd.lib(ifstream.obj) : error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
libcimtd.lib(iostrini.obj) : error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
libcimtd.lib(ofstream.obj) : error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
Searching ...\Vc7\atlmfc\lib\atlsd.lib:
Searching ...\Vc7\PlatformSDK\lib\wininet.lib:
Searching ...\Vc7\PlatformSDK\lib\oleacc.lib:
Searching ALXGridD.lib:
Searching ...\Vc7\atlmfc\lib\nafxcwd.lib:
Searching ...\Vc7\lib\libcmtd.lib:
Searching...\Vc7\lib\kernel32.lib:
Searching ...\Vc7\PlatformSDK\lib\user32.lib:
Searching ...\Vc7\PlatformSDK\lib\gdi32.lib:
Searching ...\Vc7\PlatformSDK\lib\msimg32.lib:
Searching ...\Vc7\PlatformSDK\lib\comdlg32.lib:
Searching ...\Vc7\PlatformSDK\lib\winspool.lib:
Searching ...\Vc7\PlatformSDK\lib\advapi32.lib:
Searching ...\Vc7\PlatformSDK\lib\shell32.lib:
Searching ...\Vc7\PlatformSDK\lib\comctl32.lib:
Searching ...i\Vc7\PlatformSDK\lib\shlwapi.lib:
Searching ...\Vc7\PlatformSDK\lib\uuid.lib:
Searching ...\Vc7\PlatformSDK\lib\oledlg.lib:
Searching ...\Vc7\PlatformSDK\lib\ole32.lib:
Searching ...\Vc7\PlatformSDK\lib\oleaut32.lib:
Searching ...\Vc7\PlatformSDK\lib\urlmon.lib:
Searching ...\Vc7\lib\libcpmtd.lib:
Searching ...\Vc7\lib\OLDNAMES.lib:
Searching ...\Vc7\lib\libcimtd.lib:
Searching ...\Vc7\atlmfc\lib\atlsd.lib:
Searching ...\Vc7\PlatformSDK\lib\wininet.lib:
Searching ...\Vc7\PlatformSDK\lib\oleacc.lib:
Searching ALXGridD.lib:
Searching ...\Vc7\atlmfc\lib\nafxcwd.lib:
Finished searching libraries
Debug...: fatal error LNK1169: one or more multiply defined symbols found


Ich hab versucht die Reihenfolge der Bibliotheken : libcimtd.lib, nafxcwd.lib zu änden und Linker Input Options. Habe sie ignored und wieder addiditional eingebunden.

Aber irgendwie führt das alles nicht zum Erfolg.

Das Programm läuft im Release Mode fehlerfrei! Aber ich würde halt auch öfter mal gerne Debuggen.

Wäre toll, wenn einer dieses Problem kennt und eine Lösung für mich kennt.

MFG,

Topsen
 
Diwe Antwort wird dir doch mehr oder weniger gesagt , schmeiße die lib
libcimtd.lib oder die Lib nafxcwd.lib aus deinem Debug Projekt raus. Eventuell Doku schauen ob eine speziell für Debug ist
 
nehme ich die libcimtd.lib heraus bekomme ich dutzende Fehlermeldungen
aus meinen eingebundenen Klassen, schmeisse ich die nafx raus, bekomme ich 1000 Fehlermeldungen aus den MFC Klassen
 
Um "richtige" C++ Klassen (also nicht-MFC-Klassen) in ein MFC-Projekt einzubinden, einfach in Projekt-Eigenschaften Precompiled Headers (Vorkompilierte Header) abschalten. Kompiliert dann eventuell etwas länger, dafür braucht man die eigenen C++-Klassen nicht mit stdafx.h zu verunstalten.

Man muss nur mit Includes aufpassen, in MFC-abgeleiteten Klassen sollte stdafx.h zuoberst stehen, sonst motzt der Compiler rum.

[edit-Rechtschreibung]
 
Hmm hab ich ausprobiert, es kommen weiterhin die Meldungen:

OPIE error LNK2005: "void * __cdecl operator new(unsigned int)" (2@YAPAXI@Z) already defined in libcpmtd.lib(newop.obj)
OPIE error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
OPIE error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
OPIE error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
OPIE error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (3@YAXPAXHPBDH@Z) already defined in nafxcwd.lib(afxmem.obj)
OPIE fatal error LNK1169: one or more multiply defined symbols found
 
Wenn die Einstellung mit den Precompiled Headers aus ist, am besten ein Alles-Neu-Erstellen, der Compiler ist manchmal zu doof, das richtig hinzukriegen. Und dann wie gesagt, ist es meistens die Sache mit den Includes.

In den eigenen Klassen das stdafx.h rausnehmen, aber überall, wo deine Klassen-Header includet werden, muss darüber auf jeden Fall die stdafx.h rein. Evtl. muss auch das MFC-übliche #define DEBUG_NEW (so ein 4-Zeilen-Block) darüber rein.
 
Hallo Gemeinde!

Ich reaktiviere den Thread hier mal wieder, denn ich habe in meinem Projekt plötzlich folgende Fehlermeldungen:
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (2@YAPAXI@Z) bereits in libcpmtd.lib(newop.obj) definiert
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (3@YAXPAX@Z) bereits in LIBCMTD.lib(dbgdel.obj) definiert
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (_U@YAPAXI@Z) bereits in libcpmtd.lib(newaop.obj) definiert
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (_V@YAXPAX@Z) bereits in LIBCMTD.lib(delete2.obj) definiert
Es ist ein Projekt, das MFC-Klassen mit Standard-C++-Klassen mischt. Es sind Multithreading und statisch gelinkte MFC eingestellt. Precompiled Headers ist aus. Die IDE ist VS.NET 2003.

Kann mir evtl. jemand einen Tip geben, was ich ändern muß oder wo ich nach dem Fehler suchen muß? Dafür wäre ich sehr dankbar!
 
Noch eine Ergänzung zum Auftreten des Fehlers:

Wenn ich die letzte Sicherungskope des Projektes nehme und die komplett neu kompiliere, dann ist alles OK.
Wenn ich dann eine neue Klasse hinzufüge und alles neu kompilere, ist immer noch alles OK.
Wenn ich dann das VS beende und neu starte und danach alles neu kompiliere, dann tritt der obige Linkerfehler auf.
Und das, ohne daß ich irgendetwas an den Projekteinstellungen verändert habe. Es ist auch egal, ob ich die Klasse mit dem Wizard hinzufüge oder die Dateien per Hand erstelle und sie dann zum Projekt hinzufüge. Die einzige Änderung ist also, daß eine neue Klasse hinzukommt (ohne jeden Inhalt und ohne daß sie irgendwo verwendet wird).
Ich habe gerade noch ausprobiert, die neue Klasse in eine schon vorhandene Datei einzubauen. Da gibt es keine Probleme. So habe ich wenigstens erstmal einen Workaround, auch wenn's nicht schön ist.

Vielleicht hat ja schon mal einer ein solches Problem gehabt und es erfolgreich gelöst. Über sachdienliche Hinweise würde ich mich freuen.
Ich werde jetzt erstmal der VS deinstallieren und dann neu installieren. Vielleicht hilft's ja...(seufz).
 
VS deinstallieren und neuinstallieren bringt da nichts.

Du musst da mit der Reihenfolge der Includes hantieren. Überall da, wo die deine "normalen" C-Dateien includest, muss die stdafx.h drüber stehen. Erst danach die eigenen Header includen.

So rum klappt es üblicherweise bei mir.
 
Also prinzipiell hat das mit der stdafx.h gestimmt. Ich mußte sie allersings nur in der cpp-Datei der neu erstellten Klasse einfügen. Dafür erstmal ein dickes DANKE! Die Suche danach hat mich das ganze Wochenende gekostet und ich bin fast verzweifelt, da ich morgen einen Abgabetermin habe.

Trotzdem verstehe ich den Fehler nicht.
Zur Wiederholung: Ich habe nur eine leere (generische) Klasse angelegt, ohne sie irgendwo zu verwenden. Dann habe ich alles neu kompiliert, wobei auch das linken geklappt hat. Dann habe ich das VS beendet und neu gestartet. Bein folgenden Erstellen kam dann der Linkerfehler.

Es scheint mir nicht logisch, daß das Linken vor dem Neustart geht und danach nicht mehr (bzw. nur mit dem include).
Auch da die Klasse nicht von einer anderen Klasse abgeleitet ist oder irgendwelche Members hat (egal ob MFC oder Standard) und nicht mal verwendet wird (also auch nicht gelinkt werden sollte), verstehe ich nicht, was das include der stdafx.h bewirkt.

Vielleicht kannst Du oder jemand Anderes hier mir das ja erklären.
 

Neue Beiträge

Zurück