'TypeInfochar (char *)' ist nicht definiert, hat aber vor C ++ 11 gearbeitet; Was hat sich geändert und wie kann ich den Fehler beheben?

9

Ich versuche, eine DLL aus Quellcode aus dem Crysis Wars SDK zu erstellen und habe dies in früheren Versionen von Visual Studio (nämlich 2005, 2008 und 2010) erfolgreich getan. Mein spezifisches Problem ist das:

%Vor%

Ich habe versucht, den Code in Visual Studio zu bereinigen und neu zu erstellen, wenn das nicht funktioniert, aber das hat nichts geändert.

Fehle ich etwas hier, oder hat sich etwas von C ++ 03 zu C ++ 11 geändert, was bedeutet, dass dieser Code nicht mehr kompilierbar ist, ohne zu einer älteren Version von C ++ zurückzukehren?

Ich habe diesen Code in Visual Studio 2010 sowohl mit 64 Bit als auch mit 32 Bit erfolgreich kompiliert. Daher muss es sich um ein Problem bei der Migration des Projekts nach Visual Studio 2015 handeln.

Die Kompilierung der Versionen 2012, 2013 und 2015 von Visual Studio reproduziert diesen Fehler, aber nicht 2010, daher scheint die Änderung dieses Problems in C ++ 11 eingeführt worden zu sein.

Was mache ich falsch?

Die Antwort auf mem-fun ist nicht zu lesen ein Mitglied von std , könnte es einfach sein, dass ich eine Standardbibliothek einschließen muss, die ich in früheren Versionen von Visual Studio nicht einschließen musste. Wenn das wahr ist, welche Bibliothek müsste ich #include ?

Ich habe auch ein GitHub-Repository erstellt, das nur den ursprünglichen, nicht modifizierten Code enthält, der vom SDK bereitgestellt wird , zu Testzwecken (für den Fall, dass ich selbst einen Tippfehler gemacht habe, was hier nicht der Fall zu sein scheint, aber ich habe den Link hierher gestellt, da er hilfreich sein könnte).

Wenn es darauf ankommt, verwende ich die Visual Studio 2015 Enterprise Edition unter Windows 10 Professional x64.

    
cybermonkey 04.07.2014, 20:39
quelle

1 Antwort

4

Was bedeutet der Fehler?

Die Fehlermeldung weist auf ein klassisches "deklariertes aber nicht definiertes" Szenario hin.

TypeInfo<char>(char*) wird in TypeInfo.h (über einige Makros) deklariert und im Projekt CryCommon in AutoTypeInfo.cpp deklariert.

Normalerweise würden Sie nur sicherstellen, dass das CryCommon-Projekt korrekt erstellt und korrekt in Ihr endgültiges GameDll-Projekt eingebunden wurde und das war's.

Aber es stellt sich heraus, dass das CryCommon-Projekt lange Zeit nicht gebaut wurde - es verweist auf viele andere Crytek-Bibliotheken usw. Das Problem muss also sein, dass etwas diese TypeInfo<> -Definitionen benötigt und vorher nicht.

Was bezieht sich auf den TypeInfo<> Code?

In Ihrem Projekt ist es die Funktion CmdHelp() in Aurora / Code / GameCVars.cpp, genau diese Zeile:

%Vor%

Die Implementierung der Methode FRead() erfolgt in CryCommon / ICryPak.h:

%Vor%

Wie Sie sehen können, wenn bSwap wahr ist (der Standardwert), wird SwapEndian() dort aufgerufen.

Warum hat sich das nicht schon früher manifestiert?

Vielleicht hat sich der Compiler tatsächlich anders verhalten.

Oder, wahrscheinlicher, Sie haben das Projekt immer zuvor als Release kompiliert. Die gesamte Byte-Swapping-Funktionalität ist nur auf Big-Endian-Systemen aktiviert (und Ihr Ziel ist höchstwahrscheinlich nicht eins davon) oder beim Debugging - dann werden die Bytes tatsächlich zweimal ausgetauscht, um den zugehörigen Code zu testen (siehe CryCommon / Endian.h) .

Was kann getan werden, um es zu reparieren?

Sie haben jetzt mehrere Möglichkeiten:

  • Kompilieren Sie nur als Release (wahrscheinlich wie zuvor). Vielleicht werden Sie den Code in einem Debugger sowieso nicht debuggen.

  • Kommentieren Sie einfach den Swap-Aufruf in FRead() code out. Sie verwenden es, um eine Textdatei trotzdem zu laden, und keinen Sinn darin, die Zeichen zu tauschen.

  • ...

FWIW, andere Dinge, die ich tun musste, um den Code kompilieren zu lassen:

  • Sieh dir das frühere Commit vor "Broken" an
  • Laden Sie Mods \ Aurora \ Code \ Aurora.sln
  • Entfernen Sie nicht vorhandene .vcprojx-Projekte
  • Fügen Sie alle 3 .vcproj-Dateien erneut hinzu, lassen Sie sie in VS2015-Dateien konvertieren
  • Fügen Sie für das GameDll-Projekt die Präprozessordefinition _SILENCE_STDEXT_HASH_DEPRECATION_WARNING hinzu.
  • Setzen Sie für das GameDll-Projekt die aktivierte C ++ - Ausnahmebehandlung /EHsc
  • Kommentieren Sie den obigen Code
Yirkha 29.02.2016, 22:48
quelle