Fehlermeldung ->Laufzeitbibliothek
-
Jetzt habe ich mal einen Fehler mit dem ich wirklich nichts anfangen kann.
Ich habe in den Projekt->Eigenschaften->C/C++->Codegenerierung
von Multithreaded-DLL auf Multisthreaded umgestellt damit das Programm auch auf denren PCs läuft und erhalte folgende Fehlermeldung:Fehler 236 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__malloc_dbg" in Funktion ""void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z)". libcpmtd.lib
Fehler 237 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__free_dbg" in Funktion ""void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z)". libcpmtd.lib
Fehler 238 fatal error LNK1120: 2 nicht aufgelöste externe Verweise. E:\vc++\Selbstauskunft.dll\Debug\Selbstauskunft.dllZudem noch eine Warnung die damit zu tun haben könnte:
Warnung 235 warning LNK4098: Standardbibliothek "LIBCMT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden. Selbstauskunft
Das Symbol "free_dbg" gibts bei mir nicht...
Wenn ich das alles auf Multithreaded-DLL lasse, kommen diese fehler nicht, aber dann läuft das Programm auf einem anderen Rechner nicht.Kann mir wer helfen?
Danke Mondmann
-
Läuft auf einem anderen Rechner nicht, ist eine unbefriedigende Fehlerangabe. Was sagt denn Windows? IRgend eine Meldung muß ja hochpoppen. Ich kann mir gut vorstellen, das der andere PC keine Debug-Versionen von den DLLs hat. Dann mußt du (sowieso) eine Release-EXE erstellen und diese weiter geben.
-
...aber was bedeuten denn diese Fehlermeldungen?
Mondmann
-
"Verweis auf nicht aufgelöstes externes Symbol" heißt, das der Linker den übersetzen Code (also die implementierung) nicht finden kann. Der Compiler hat zwar vielleicht die Header-Datei gesehen, aber der Linker findet den compilierten Code nicht.
Entweder hat man eine Lib nicht eingebunden oder man hat die falsche Lib-Version. Du kannst beim VC++ coolerweise auch in den Suchindex der MSDN-Hilfe einfach den Fehlercode (z.B. LNK2019) eingeben, und eine genauere Fehlerbeschreibung lesen. Da stehen immer nütztliche Hinweise drin.
Noch ein Tip: wenn dein Projekt und die Lib unterschiedliche wchar_t-Einstellungen haben, dann wird es auch Link-Probleme geben. Hatte letztens auch drei Tage wegen so einem Unterschied den Fehler nicht gefunden.
-
Hm ich komm einfach nicht drauf.
Denn es heist ja:Symbol "__malloc_dbg" in Funktion ""void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)"
"
Also das Symbol __malloc_dbg ...was soll das denn sein?
Das gibts bei mir nirgens...und dann "in Funkion..."void * __cdecl operator new(..)
Den Operator new habe ich natürlich einige Male.
Könnte da ein Fehler drin sein?Mondmann
-
Mondmann schrieb:
Also das Symbol __malloc_dbg ...was soll das denn sein?
Das gibts bei mir nirgens...Das ist eine Hilfsfunktion, die intern von new verwendet wird, um den Speicher (zuzüglich einige Informationen für Debugger und Memory-Überwacher) zu reservieren.
Den Operator new habe ich natürlich einige Male.
Könnte da ein Fehler drin sein?Der Fehler könnte daran liegen, daß du die Debug-Version von new zusammen mit einer Release-Library verwendest.
-
Der Fehler könnte daran liegen, daß du die Debug-Version von new zusammen mit einer Release-Library verwendest.
Also wenn ich in den Projekteinstellungen->Codegenerierung
Multithread angebe dann kommen die Fehler, wenn ich aber
Multithread-Debug angebe dann nicht.Hab jetzt mal wie in der Hilfe beschrieben folgende bibliotheken ignoriert:
Für Multithreaded (libcmt.lib): libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Hab das noch in der Hilfe gefunden:
Die Laufzeitbibliotheken bieten nun Direktiven, um das Vermischen unterschiedlicher Typen zu verhindern. Diese Warnung wird bei dem Versuch ausgegeben, unterschiedliche Typen oder Debug- und Nicht-Debugversionen der Laufzeitbibliothek im selben Programm zu verwenden. Wenn Sie z. B. eine Datei zur Verwendung eines Laufzeitbibliothekstyps und eine andere Datei zur Verwendung eines anderen Typs kompiliert haben (z. B. singlethreaded gegenüber multithreaded) und anschließend versuchen, sie zu verknüpfen, wird diese Warnung ausgegeben. Sie sollten alle Quelldateien für die Verwendung derselben Laufzeitbibliothek kompilieren. Weitere Informationen finden Sie in den Compileroptionen unter Laufzeitbibliothek verwenden (/MD, /MT, /LD).
Was heist das jetzt genau?
Wie weiß ich denn welche .lib ich verwenden kann und wo gebe ich das an?Leider kommt immer noch derselbe Fehler...
Mondmann