2016-04-18 8 views
2

Ich aktualisiere von VS2013 zu VS2015 und erhalte die folgende Warnung. Ich dachte VS2015 implementiert magische Statik, so dass das lokale statische Objekt thread-sicher sein sollte, also was ist los?VS2015 unterstützt magische Statik, warum also diese Warnung?

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\system_error(698): error C2220: warning treated as error - no 'object' file generated 
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\system_error(704): note: see reference to function template instantiation '_Ty &std::_Immortalize<std::_Generic_error_category>(void)' being compiled 
      with 
      [ 
       _Ty=std::_Generic_error_category 
      ] 
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\system_error(698): warning C4640: '_Static': construction of local static object is not thread-safe 

Der Fehler ist in der System_error-Header aus dem VS-Installationsordner. Der Fehler ist in dieser Funktion:

template<class _Ty> inline 
    _Ty& _Immortalize() 
    { // return a reference to an object that will live forever 
    static _Immortalizer<_Ty> _Static; 
    return (*reinterpret_cast<_Ty *>(&_Static._Storage)); 
    } 

Das ist alles, der Kontext gibt im Fehler ist, und ich kann nicht sehen, wo system_error wird tatsächlich enthalten.

Compiler-Flags sind:

/Yu"stdafx.h" /GS /analyze /W3 /wd"4481" /wd"4251" /Zc:wchar_t 
/Zi /Gm- /O2 /sdl /Fd"x64\Release\\Release_vc140.pdb" /Zc:inline /fp:precise 
/errorReport:prompt /WX /Zc:forScope /Gd /MT /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\MyProj.pch" 

aktualisieren

Sorry, es jetzt behoben zu sein scheint. Es sieht so aus, als wäre ich auf dem v140_xp-Toolset und der falschen TargetPlatformVersion. Dieser musste durch das Netz geschlüpft sein, als ich dachte, ich hätte sie alle ersetzt. Ich bin mir nicht ganz sicher, warum diese Fehler zu diesem Fehler führen würden. Wie auch immer, danke für die Hilfe bis jetzt.

+1

Welche Compiler-Flags verwenden Sie? – cpplearner

+0

ist es standardmäßig erforderlich, und es gibt nichts Magisches daran. Wenn MSVC im Jahr 2015 nicht in der Lage ist, C++ 11 in einem solchen grundlegenden Feature zu folgen, weiß ich nicht, was ich sagen soll. – SergeyA

+0

@SergeyA - Was ist vom Standard gefordert? –

Antwort

2

Es sieht aus wie seine durch die falsche Warnung verursacht, die zu einem Fehler eingeschaltet wird, lesen Sie diesen Fehler an:

https://connect.microsoft.com/VisualStudio/feedback/details/2539759/c4640-warning-cannot-be-disabled

Der Fehler C2220 zeigt Sie können/WX-Schalter, der an den Compiler sagt behandle alle Warnungen als Fehler.

können Sie diese Warnung deaktivieren mit:

#pragma warning (disable : 4640) 

btw. nicht verwandt, aber könnte nützlich für Sie sein. Sie verwenden _Immortalizer als einen Namen für Ihre Klasse, die mit Unterstrich gefolgt von Großbuchstaben beginnt. Dies ist standardmäßig verboten: lesen Sie hier: What are the rules about using an underscore in a C++ identifier?.

+2

Das ist nicht meine Klasse, das ist von den Standard-Headern, wo der Fehler auftritt. –

+0

@ScottLangham Oh, ich verstehe - Wenn Ihr Problem nicht mehr reproduzierbar ist, löschen Sie Frage – marcinj

+1

Ich kann es reproduzieren, also würde ich denken, diese Frage könnte immer noch nützlich sein, wenn jemand anderes ihr Projekt falsch konfiguriert hat und den gleichen Fehler bekommt. –

2

Es wird durch Änderungen in MSBuild Toolset v140_xp verursacht. Problem erscheint, wenn:

  • Projekt baut mit VS2015 Update 2, Toolset v140_xp
  • Projektkonfiguration ist Dynamische Bibliothek
  • Projekt wurde mit ATL App Wizard erstellt, so * .vcxproj enthält tag <Keyword>AtlProj</Keyword>

Es gibt eine Umgehung: Öffnen Sie die * .vcxproj-Datei, suchen Sie das Tag <Keyword>AtlProj</Keyword> und ersetzen Sie es durch <Keyword>Win32Proj</Keyword>. Während des Kompilierens wird nichts geändert, aber die Warnung verschwindet.

Wenn Sie Details wissen möchten, navigieren Sie zum Verzeichnis C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms\Win32\PlatformToolsets\v140_xp, öffnen Sie Toolset.props und finden Sie den Kommentar <!-- Added /Zc:threadSafeInit- for ATL dll projects and enable the C4640 warnning -->. Die darunter liegende Zeile aktiviert die Warnung und deaktiviert die "magische statische" Funktion aus C++ 11.

P.S. Bitte beachten Sie, dass die Warnung nicht nutzlos ist: "magic static" verwendet thread-lokalen Speicher, der unter dem hässlichen WindowsXP-Kernel-Fehler leidet: Zugriff auf TLS von DLL verursacht Absturz, wenn Anwendung ohne TLS-Unterstützung gebaut wird.Alle DLL-Plugins mit WinXP-Unterstützung sind von diesem Fehler betroffen.

Verwandte Themen