Wie kann ich die Ursache für diese Linker-Fehler finden?
-
21-09-2019 - |
Frage
Nach dem durch einen langwierigen Prozess geht ein Projekt, mein DLL-Projekt im Debug-Modus aufbauen wird nicht umbenannt werden (Release baut Arbeit):
MSVCRTD.lib(msvcr90d.dll) : error LNK2005: _CrtDbgReportW already defined in LIBCMTD.lib(dbgrpt.obj)
Dieses Projekt und die fünf statischen Bibliotheken es hängt davon ab, festgelegt verwenden "Multi-Threaded-Debug (/ MTD)" (unter C / C ++ | Codegenerierung | Runtime Library). Ich glaube, Libcmtd.lib die eine für Multi-Threaded Debug ist, aber was ist MSVCRTD.lib, und was verursacht diese Fehler werden könnte?
Wenn es einen Unterschied macht, diese DLL ist für Windows CE.
Lösung
LIBCMT ist, was Sie für / MT benötigen, MSVCRT ist, was Sie für / MD benötigen. Sie verknüpfen OBJ und LIB-Dateien, die gemischt waren, einige kompiliert mit / MT mit / MD einigen. Das ist nicht gut.
In der Regel ist es die LIB-Dateien, die das Problem verursachen. Überprüfen Sie ihre Build-Einstellungen und stellen Sie sicher, ihre / M Option die gleiche wie Ihre DLL-Projekt ist.
Auch passen sie von der Mühe, die Sie in bekommen, wenn die DLL mit / MT kompiliert wurde. Sie werden große Probleme haben, wenn die DLL zurückkehrt Zeiger auf Objekte, die der Client lösen muss. Es kann nicht, ist es nicht den gleichen Speicherzuordner verwenden.
Andere Tipps
Der MSDN-Artikel auf LNK4098 eine sehr nützliche Tabelle hat: es Ihnen sagt, welche Bibliotheken manuell auf die „Ignorieren spezifische Bibliothek“ -Liste hinzufügen, je nachdem, welche CRT Sie verwenden. In Ihrem Fall sollten Sie alle diese ignorieren:
libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib
Beachten Sie, dass die gemeldete Bibliothek in dieser Liste auch. Das Problem wird ausführlicher beschrieben in KB154753 ... Bibliotheken, dass ein Programm mit verbinden wird, wenn gebaut mit Visual C ++
Meine Interpretation ist, dass in bestimmten Situationen der Algorithmus, der automatisch Picks, die CRT-Bibliotheken Code zu verknüpfen mit mehreren widersprüchlichen Bibliotheken abholt.
Was ist Mitteilung zu setzen? eine DLL Multithreaded Debug-Einstellung kann zu Problemen führen, wenn Sie Speicher zuweisen, dass etwas die DLL versucht accesing zu befreien (sie werden in verschiedenen Haufen zugeordnet werden, zum Beispiel). Versuchen Sie, mit mehreren Threads Debug-DLL.
Ihr Link Problem entsteht, wahrscheinlich, weil eine Bibliothek, die Sie verknüpfen wird Multithreaded Debug-DLL erwartet, so dass die Linker versuchen beide zu verbinden und Ihre Verbindung ausfällt ...
Das Problem ist die msvcr90d.dll ist nicht in der Windows CE-Bild. Es muss mit der Anwendung bereitgestellt werden. Die msvcr90d.dll wird in $ (VCInstallDir) / ce / bin / $ (ARCHFAM) gelegen.
http://stackoverflow.com/questions/15959877/windows-ce-6-0-and-runtime-link-to-debug-dll-mdd