2010-12-02 32 views
5

Ich habe ein DLL-Projekt, in dem, wenn in Release-Konfiguration ich das Projekt erstellen, erhalte ich die folgende Warnung:Visual Studio Linker Warnung LNK4098

MSVCRT.lib (cinitexe.obj): Warnung LNK4098: defaultlib 'msvcrtd.lib' Konflikte mit der Verwendung anderer Bibliotheken; verwenden /NODEFAULTLIB: Bibliothek

Es ist nur eine Warnung, aber ich weiß nicht, ob dies berücksichtigt werden soll.

Für was ich herausgefunden habe, sind sie beide Multithread-Bibliotheken, normale und Debugging-Versionen. Meine dll nutzt Multithreading und ich kann es debuggen, obwohl ich boost: Thread für sie, so dass ich weiß nicht wirklich, wenn ich diese Windows-spezifische Bibliotheken für das Debuggen benötigen oder Gebäude lösen ...

Mit freundlichen Grüßen, Alex

Nun, ich habe als BuschnicK vorgeschlagen und/VERBOSE verwenden: LIB-Linker-Flag ich fand heraus, dass ich in Debug-Konfiguration zu diesen Bibliotheken wurde die Verknüpfung:

boost_filesystem-VC100-mt-gd-1_44.lib: libboost_system- vc100-mt-gd-1_44.lib: libboost_thread-vc100-mt-gd-1_44.lib: libboost_datum_zeit-vc100-mt-gd-1_44.lib:

Ich hatte das selbe in Release config, meistens weil ich dann "explizit" nicht angegeben habe. So änderte ich sie dazu in Release:

boost_filesystem-VC100-mt-1_44.lib: libboost_system-VC100-mt-1_44.lib: libboost_thread-VC100-mt-1_44.lib: libboost_date_time-VC100 -mt-1_44.lib:

Das scheint zu funktionieren, aber ich bekam immer noch die erste Warnung, bis ich erkannte, dass ich die _DEBUG-Präprozessor-Definition in meiner Release-Konfiguration hatte, entfernte sie und es funktioniert jetzt süß.

Danke allen für die Hilfe !!

Antwort

7

Es klingt, als könnten Sie eine Debug-Bibliothek und eine releaste kompilierte Bibliothek im selben Build ausführen.

Gehen Sie Ihre Projektoptionen durch und wählen Sie die Debug-Versionen der von Ihnen verwendeten Bibliotheken von Drittanbietern aus.

+0

Die einzige Boost-Bibliothek, die ich benutze, die lib-Verknüpfung benötigt, ist das Dateisystem, das, hsa zwei Versionen: – AlejandroVK

+0

Vergessen letzten Kommentar: Die einzige Boost-Bibliothek, die ich benutze, dass lib-Verknüpfung ist das Dateisystem, das, hsa zwei Versionen: boost_filesystem-vc100-mt-gd-1_44.lib, boost_dateisystem-vc100-mt-1_44.lib. Ich denke, der erste ist für Multithread-Debugging und zweitens nur mt. Ich habe noch nie in meinen Linker-Optionen angegeben, welche zu wählen, es tut es "automatisch" ... könnte dies die Ursache der Probleme sein? – AlejandroVK

10

Es sagt, was das Problem direkt in der Nachricht ist, wenn Sie sorgfältig zu lesen: „MSVCRT.lib“ vs „MSVCRTD.lib“

Mitteilung der addierte „d“ in der zweiten Bibliothek Namen. Was passiert ist, dass Sie statisch auf die Visual Studio C++ - Laufzeit (MSVCRT) verlinken. Eine Ihrer Bibliotheken zieht die Release-Version dieser lib, während eine andere die Debug-Version aufruft (daher das Postfix "d"). Der Linker teilt Ihnen mit, dass beide Bibliotheken Funktionen mit demselben Namen definieren, sich im Konflikt befinden und somit einer von ihnen automatisch gelöscht wird.

Um dies zu beheben, gehen Sie die Buildeinstellungen aller Ihrer Projekte/Bibliotheken durch und stellen Sie sicher, dass sie die gleichen Laufzeitbibliotheken für alle Buildkonfigurationen verwenden. Suchen Sie in project properties ->C/C++ ->Code Generation ->Runtime Library. Dies sollte wahrscheinlich "Multi-Threaded" für Release-Builds und "Multi-Threaded Debug" für Debug-Builds lesen.

Beachten Sie, dass es im Allgemeinen als unpraktisch angesehen wird, diese Bibliotheken statisch zu verknüpfen und dass Sie die dynamisch verknüpften DLL-Versionen bevorzugen sollten.

+0

MSVCRT ist bereits die dynamische Version. Sie müssen immer noch eine Verbindung herstellen, obwohl es sich um eine Exportbibliothek handelt. http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx –

+0

Sorry meine schlechte. Du hast natürlich Recht. Der Rest der Antwort sollte dennoch korrekt sein. – BuschnicK

+0

Hmmmmm, ich habe beide Konfigurationen überprüft, in Debgug -> Multi-threaded Debug DLL (/ MDd) und in Release -> Multi-threaded DLL (/ MD), und ich bekomme immer noch die Warnung, muss ich/verwenden NODEFAULTLIB: MSVCRTD.LIB für Release-Konfiguration? – AlejandroVK