2015-06-25 22 views
12

Sto eseguendo un'applicazione DirectX 11 su Windows 7 e Visual Studio Community 2015 RC. Sto ancora utilizzando le funzioni dal DX SDK. Ha funzionato bene su VS2013, ma quando sono passato io ottiene solo il seguente errore:Simbolo esterno non risolto __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 

io uso solo la funzione DXGetErrorDescriptionA dalla libreria dxerr e quando io commento fuori, il programma compila bene. Non ho idea di cosa sia sbagliato ma non può essere dal DX SDK o altrimenti le altre funzioni fallirebbero giusto?

risposta

4

Le librerie DirectX in uso sono compilate con una versione precedente di Visual Studio rispetto a quella in uso. Microsoft a volte apporta modifiche al proprio runtime C, creando incompatibilità tra le librerie compilate con versioni diverse. __vsnprintf era un simbolo interno nelle versioni precedenti del loro runtime C, non esiste nella versione RC 2015.

Sfortunatamente, dxerr.lib (insieme a d3dx11.lib) è stato deprecated. Sono disponibili due opzioni: è possibile tornare a VS2013 oppure interrompere l'uso della funzionalità da dxerr.lib. Quest'ultimo è probabilmente migliore, perché è possibile duplicare la sua funzionalità utilizzando FormatMessage ora (maggiori informazioni nell'articolo collegato).

+0

Una terza opzione è creare il proprio [dxerr] (https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/). –

2

HACKY ma è possibile correggere dxerr.lib.

Sostituire __vsnprintf con _vsnprintf (con un null alla fine per tenere conto della sottolineatura rimosso all'inizio)

15

Invece di hacker dxerr.lib manualmente, si potrebbe aggiungere

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

qualche parte nella tua codice

+0

Grazie! Ha funzionato per me. –

2

Il legacy DirectX SDK è piuttosto vecchio e dxerr.lib nel DXSDK non è compatibile con il Runtime C di VS 2015 come si è verificato.

In generale le librerie statiche con codice in esse non si combinano bene con le diverse versioni del compilatore. La maggior parte delle .lib nel DirectX SDK legacy funzionano con VS 2015 perché sono librerie di importazione per DLL o tutte le librerie di dati e quindi non contengono alcun codice. Il DXSDK non è stato aggiornato dal 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.

Ho implementato una versione di DXERR che si può costruire dai sorgenti nel progetto per rimuovere questo dependacy di SDK legacy DirectX. Vedi this post per i dettagli. Detto questo, ho volutamente supportato solo Unicode (la versione W). Puoi capire come rendere l'ANSI (la versione A) abbastanza facilmente, ma sarebbe meglio se avessi aggiornato la tua app per usare Unicode.

Vedere Where is the DirectX SDK (2015 Edition)? e DXUT for Direct3D 11.

UPDATE: Come notato in un'altra risposta che collega con legacy_stdio_definitions.lib dovrebbe rendere il vecchio retaggio versione DirectX SDK di dxerr.lib collegamento nuovo con VS 2015/2017. Detto questo, dovresti lavorare sulla rimozione delle dipendenze sul legacy DirectX SDK il più possibile e DXERR può essere facilmente sostituito dal tuo modulo. Vedi Living without D3DX.

24

ho sperimentato lo stesso problema usando DXGetErrorMessage() con Dx9 e abbiamo scoperto che gli Stati membri hanno fornito una libreria aggiuntiva da includere nella pagina di Additional Dependencies proprietà per affrontare questo problema.Il nome della libreria è: legacy_stdio_definitions.lib

L'aggiunta di questo ha risolto il problema per me.

+0

Anche questa è una risposta valida. Grazie per l'input. –

+0

Io voto per questo.Grazie LaurieW. E l'articolo aggiuntivo può essere trovato qui: https: //msdn.microsoft.com/en-us/library/bb531344.aspx – SONIC3D

+0

Questa è la migliore risposta. –

1

È possibile modificare il set di strumenti della piattaforma da Visual Studio 2015 a Visual Studio 2013 e quindi compila. Il set di strumenti della piattaforma si trova nella scheda Generale delle proprietà del progetto.