2017-11-22 6 views
0

Ich habe eine neue Konfiguration DebugWithReleaseCRT zu unseren CMake-Skripten hinzugefügt, die auf der Standardkonfiguration Debug config basiert, aber mit Release CRT (/MD statt /MDd) verknüpft ist und _ITERATOR_DEBUG_LEVEL=0 definiert. I checked Projektdatei Einstellungen erzeugt und sieht alles gut aus:VS: Wie DebugWithReleaseCRT zu konfigurieren?

C/C++ -> Code Generation -> Runtime = Multi-Threaded-DLL (/ MD)

Allerdings, wenn ich es bauen bekomme ich Fehler wie:

3> 3rd-party.lib (3-party.obj): Fehler LNK2038: Nichtübereinstimmung erkannt für 'Runtime': Wert 'MD_DynamicRelease' Wert 'MDd_DynamicDebug' in My stimmt nicht überein. obj

, die ich lesen, wie:

Ihre My.cpp Datei mit Debug-CRT zusammengestellt (MDd_DynamicDebug), während Sie versuchen, mit Bibliothek 3rd-party.lib zu verknüpfen, die mit Release-CRT (MD_DynamicRelease)

gebaut

Ich überprüfte auch diese bestimmte Datei (My.cpp) Einstellungen, aber nichts Besonderes, es erbte /MD Flag aus dem übergeordneten Projekt.

Warum ist mein Projekt mit Debug CRT trotz der angegebenen /MD Flag verbunden?

+0

Versuchen Sie, den Cache zu säubern, das Objekt speichert erneut eine Neuerstellung. Beachten Sie auch, dass "MD_DynamicRelease" nicht mit dem Wert "MDd_DynamicDebug" übereinstimmt, der anzeigt, dass Sie einen falschen [CMAKE_BUILD_TYPE] aufrufen oder verwenden (https://cmake.org/cmake/help/v3.0/variable/CMAKE_BUILD_TYPE.html) – Joel

+0

@Joel: Es ist nicht Cache-Problem oder Neuerstellung, und 'CMAKE_BUILD_TYPE' ist in VS-Fall nicht relevant –

+0

Ist es möglich, beide/MD und/MDd in der Befehlszeile verwendet werden? (Überprüfen Sie die "Befehlszeile" in den Projekteinstellungen). Vielleicht/MDd überschreibt/MD, und die IDE zeigt es nicht korrekt in den Projekteinstellungen an. – MuertoExcobito

Antwort

0

Das Problem wird mit VS Precompilers Definition im Zusammenhang _DEBUG

Der Compiler _DEBUG definiert, wenn Sie die/MTd oder/MDd Option angeben. Diese Optionen geben Debug-Versionen der C-Laufzeitbibliothek an.

Da meine DebugWithReleaseCRT Config auf Debug basiert, kopiert es _DEBUG zu Definition. Stellt sich heraus, dass, wenn _DEBUG definiert ist, es überschreibt /MD flag (MD_DynamicRelease) und VS noch Links mit Debug CRT (hey Visual Studio-Team, das war eine Überraschung!). Das Problem wurde durch Entfernen von _DEBUG von DebugWithReleaseCRT gelöst. Tatsächlich wurde es gelöst, indem _DEBUG durch NDEBUG ersetzt wurde, weil einige Abhängigkeiten von Drittanbietern genau eine von ihnen erforderten, um definiert zu werden. Ich bin immer noch nicht sicher, dass es eine saubere Möglichkeit ist, DebugWithReleaseCRT zu konfigurieren, ich fühle mich nicht besonders sicher über die Definition von NDEBUG in Form von Debug Config.

Verwandte Themen