visual-studio - Auflösen von LNK4098:defaultlib 'MSVCRT' steht in Konflikt mit




dll linker warnings (5)

Diese Warnung:

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
  with use of other libs; use /NODEFAULTLIB:library

ist eine ziemlich häufige Warnung in Visual Studio. Ich würde gerne den genauen Grund dafür und den richtigen Weg (wenn überhaupt) verstehen, um damit umzugehen.

Dies kommt in einem Debug-Build, kompiliert mit /MDd . Das Projekt ist mit Dingen wie windows Version.dll und pdh.dll die selbst mit MSVCRT.dll . Offensichtlich habe ich die Debug-Versionen von diesen nicht und kann sie nicht kompilieren.

Also habe ich /NODEFAULTLIB:MSVCRT der Linker-Befehlszeile hinzugefügt und die Warnung tatsächlich entfernt. Aber was macht das eigentlich? Und warum ist es notwendig?


Answers

IMO dieser Link von war sehr gut und relevant, aber schmerzhaft zu lesen. Ich habe eine Zusammenfassung geschrieben.

Yochai, wenn du das jemals liest, sieh bitte die Notiz am Ende.

Für den ursprünglichen Post lesen: Warnung LNK4098: defaultlib "LIBCD" Konflikte mit der Verwendung anderer Bibliotheken

Error

LINK: Warnung LNK4098: defaultlib "LIBCD" kollidiert mit der Verwendung anderer Bibliotheken; Verwenden Sie / NODEFAULTLIB: Bibliothek

Bedeutung

Ein Teil des Systems wurde kompiliert, um eine Single-Thread-Standardbibliothek (libc) mit Debug-Informationen (libcd) zu verwenden, die statisch verknüpft ist

während ein anderer Teil des Systems kompiliert wurde, um eine Multithread-Standardbibliothek ohne Debug-Informationen zu verwenden, die sich in einer DLL befindet und dynamische Verknüpfung verwendet

Wie man auflöst

  • Ignoriere die Warnung, schließlich ist es nur eine Warnung. Ihr Programm enthält jedoch mehrere Instanzen derselben Funktionen.

  • Verwenden Sie die Linkeroption / NODEFAULTLIB: lib. Dies ist keine vollständige Lösung, auch wenn Sie Ihr Programm so verknüpfen können, dass Sie ein Warnzeichen ignorieren: Der Code wurde für verschiedene Umgebungen kompiliert, ein Teil Ihres Codes kann für ein einzelnes Threaded-Modell kompiliert werden, während anderer Code ist Multithread.

  • [...] durchsuchen Sie alle Ihre Bibliotheken und stellen Sie sicher, dass sie die richtigen Linkeinstellungen haben

In letzterem können, wie im ursprünglichen Beitrag erwähnt, zwei häufige Probleme auftreten:

  • Sie haben eine Drittanbieter-Bibliothek, die anders mit Ihrer Anwendung verknüpft ist.

  • Sie haben andere Direktiven in Ihren Code eingebettet: normalerweise ist dies die MFC. Wenn Module in Ihrem System mit MFC verbunden sind, müssen alle Module nominell mit der gleichen MFC-Version verknüpft sein.

Stellen Sie in diesen Fällen sicher, dass Sie das Problem verstehen und entscheiden Sie sich für die Lösungen.

Hinweis: Ich wollte diese Zusammenfassung von Yochai Timmers Link in seine eigene Antwort aufnehmen, aber da einige Leute Schwierigkeiten haben, die Änderungen richtig zu überprüfen, musste ich sie in einer separaten Antwort schreiben. Es tut uns leid


Ich bekomme dies jedes Mal, wenn ich eine Anwendung in VC ++ erstellen möchte.

Klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Eigenschaften und dann unter 'Konfigurationseigenschaften | C / C ++ | Codegenerierung ', wählen Sie "Multi-threaded Debug (/ MTd)" für die Debug-Konfiguration.

Beachten Sie, dass dies die Einstellung für Ihre Release-Konfiguration nicht ändert. Sie müssen zum selben Speicherort gehen und "Multi-threaded (/ MT)" für Release auswählen.



Klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Eigenschaften und dann unter 'Konfigurationseigenschaften | Linker | Eingabe | Ignoriere spezifische Bibliothek und schreibe msvcrtd.lib


Der beste Weg, um dieses Szenario zu bewältigen, ist:

Erstellen Sie Ihre Bibliothek und benennen Sie sie mit dem Compiler und den StL-Versionen, die im Bibliotheksnamen enthalten sind, genau wie Boost-Bibliotheken.

Beispiele:

- FontManager-msvc10-mt.dll für DLL-Version, spezifisch für MSVC10-Compiler, mit der Standard-Stl.

- FontManager-msvc10_stlport-mt.dll für DLL-Version, spezifisch für MSVC10-Compiler, mit dem STL-Port.

- FontManager-msvc9-mt.dll für DLL-Version, spezifisch für MSVC 2008 Compiler, mit der Standard-Stl

- libFontManager-msvc10-mt.lib für die statische lib-Version, spezifisch für den MSVC10-Compiler, mit der Standard-stl.

Wenn Sie diesem Muster folgen, vermeiden Sie Probleme im Zusammenhang mit verschiedenen stl-Implementierungen. bedenke, die stl-implementierung in vc2008 unterscheidet sich von der stl-implementation in der vc2010.

Sehen Sie sich Ihr Beispiel mit boost :: config library an:

#include <boost/config.hpp>

#ifdef BOOST_MSVC
#  pragma warning( push )
#  pragma warning( disable: 4251 )
#endif

class DLL_EXPORT FontManager
{
public:
   std::map<int, std::string> int2string_map;
}

#ifdef BOOST_MSVC
#  pragma warning( pop )
#endif




visual-studio dll linker warnings msvcrt