2015-06-25 21 views
12

Ich führe eine DirectX 11-Anwendung auf Windows 7 und Visual Studio Community 2015 RC. Ich verwende immer noch Funktionen aus dem DX SDK. Es funktionierte gut auf VS2013, aber wenn ich umgeschaltet erhalte ich nur die folgende Fehlermeldung:Nicht aufgelöstes externes Symbol __vsnprintf .... (in dxerr.lib)?

Error LNK2019 unresolved external symbol __vsnprintf referenced in function "long __stdcall StringVPrintfWorkerA(char *,unsigned int,unsigned int *,char const *,char *)" ([email protected]@[email protected]) Ancora D:\Moody\Moody\Projects\Projects\Ancora\Ancora\dxerr.lib(dxerra.obj) 1 

ich nur die Funktion DXGetErrorDescriptionA verwenden aus der dxerr Bibliothek und wenn ich kommentieren Sie sie aus, stellt das Programm in Ordnung. Ich habe keine Ahnung, was falsch ist, aber es kann nicht vom DX SDK sein oder sonst würden die anderen Funktionen scheitern, richtig?

Antwort

4

Die DirectX-Bibliotheken, die Sie verwenden, werden mit einer älteren Version von Visual Studio kompiliert, als Sie verwenden. Microsoft nimmt manchmal Änderungen an ihrer C-Laufzeit vor und erstellt Inkompatibilitäten zwischen Bibliotheken, die mit verschiedenen Versionen kompiliert wurden. __vsnprintf war ein internes Symbol in älteren Versionen ihrer C-Laufzeit, in der RC-Version 2015 existiert sie nicht.

Leider war dxerr.lib (zusammen mit d3dx11.lib) deprecated. Sie haben zwei Möglichkeiten - Sie können zurück zu VS2013 wechseln oder Sie können die Funktionalität von dxerr.lib nicht mehr verwenden. Letzteres ist wahrscheinlich besser, weil Sie seine Funktionalität mit FormatMessage jetzt duplizieren können (mehr Informationen im verknüpften Artikel).

+0

Eine dritte Möglichkeit besteht darin, ein eigenes [dxerr] zu erstellen (https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/). –

2

HACKY aber du könntest dxerr.lib patchen.

ersetzen __vsnprintf mit _vsnprintf (mit einem Null am Ende für den entfernten Strich am Anfang zu berücksichtigen)

15

Statt manuell von Hacking dxerr.lib, könnten Sie

#include <Windows.h> 
#include <stdio.h> 
int (WINAPIV * __vsnprintf)(char *, size_t, const char*, va_list) = _vsnprintf; 

irgendwo hinzufügen in Ihrem Code

+0

Danke! Es hat für mich funktioniert. –

2

Das veraltete DirectX-SDK ist ziemlich alt, und dxerr.lib in der DXSDK ist nicht kompatibel mit VS 2015 C-Runtime, wie Sie festgestellt haben.

Im Allgemeinen mischen sich statische Bibliotheken mit Code in ihnen nicht gut aus verschiedenen Versionen des Compilers. Die meisten .libs im Legacy-DirectX-SDK arbeiten mit VS 2015, da sie Importbibliotheken für DLLs oder alle Datenbibliotheken sind und daher überhaupt keinen Code enthalten. Die DXSDK nicht aktualisiert wurde seit VS 2010.

Be sure to read the instructions on MSDN on the proper way to mix the legacy DirectX SDK with the Windows 8.x SDK used by VS 2015. You are presumably using something else from the legacy DirectX SDK in this project besides dxerr.

ich eine Version von DXERR implementiert haben, die Sie von der Quelle in Ihr Projekt erstellen können diese dependacy des Vermächtnisses DirectX SDK zu entfernen. Einzelheiten siehe this post. Das heißt, ich habe absichtlich nur Unicode (die W-Version) unterstützt. Sie können herausfinden, wie Sie die ANSI-Version (die A-Version) problemlos erstellen können, aber es wäre am besten, wenn Sie Ihre App so aktualisieren, dass sie Unicode verwendet.

Siehe Where is the DirectX SDK (2015 Edition)? und DXUT for Direct3D 11.

UPDATE: Wie in einer anderen Antwort darauf hingewiesen, mit legacy_stdio_definitions.lib Verknüpfung sollte die alte Erbe DirectX SDK-Version von dxerr.lib Link wieder mit VS 2015/2017 machen. Das heißt, Sie sollten so weit wie möglich daran arbeiten, Abhängigkeiten vom DirectX-SDK zu entfernen, und DXERR kann leicht durch Ihr eigenes Modul ersetzt werden. Siehe Living without D3DX.

24

Ich habe das gleiche Problem mit DXGetErrorMessage() mit Dx9 erfahren und festgestellt, dass MS eine zusätzliche Bibliothek zur Verfügung gestellt haben, um in die Additional Dependencies Eigenschaftenseite, um dieses Problem zu adressieren.Der Name der Bibliothek lautet: legacy_stdio_definitions.lib

Hinzufügen das Problem für mich gelöst.

+0

Dies ist auch eine gültige Antwort. Danke für die Eingabe. –

+0

Ich stimme dafür. Danke LaurieW. Und ein weiterer Artikel kann hier gefunden werden: https: //msdn.microsoft.com/en-us/library/bb531344.aspx – SONIC3D

+0

Dies ist die beste Antwort. –

1

Sie können das Platform Toolset von Visual Studio 2015 in Visual Studio 2013 ändern und dann kompilieren. Das Platform Toolset befindet sich auf der Registerkarte Allgemein der Projekteigenschaften.