windows-7 - instalar - microsoft visual c++ 2016 redistributable package(x64)
Símbolo externo no resuelto__vsnprintf…(en dxerr.lib)? (7)
Estoy ejecutando una aplicación DirectX 11 en Windows 7 y Visual Studio Community 2015 RC. Todavía estoy usando funciones del SDK de DX. Funcionó bien en el VS2013, pero cuando cambié solo recibí el siguiente error:
Error LNK2019 unresolved external symbol __vsnprintf referenced in function "long __stdcall StringVPrintfWorkerA(char *,unsigned int,unsigned int *,char const *,char *)" (?StringVPrintfWorkerA@@YGJPADIPAIPBD0@Z) Ancora D:/Moody/Moody/Projects/Projects/Ancora/Ancora/dxerr.lib(dxerra.obj) 1
Solo uso la función DXGetErrorDescriptionA de la biblioteca dxerr y cuando lo comento, el programa se compila bien. No tengo idea de lo que está mal, pero no puede ser desde el SDK de DX o, de lo contrario, las demás funciones fallarían, ¿verdad?
El DirectX SDK heredado es bastante antiguo, y dxerr.lib
en el DXSDK no es compatible con el tiempo de ejecución de C de VS 2015 como lo ha encontrado.
En general, las bibliotecas estáticas con código en ellas no se mezclan bien con diferentes versiones del compilador. La mayoría de los .libs en el DirectX SDK heredado funcionan con VS 2015 porque son bibliotecas de importación para DLL o todas las bibliotecas de datos y, por lo tanto, no contienen ningún código. El DXSDK no se ha actualizado desde VS 2010.
Asegúrese de leer las instrucciones en MSDN sobre la manera correcta de mezclar el SDK de DirectX heredado con el SDK de Windows 8.x utilizado por VS 2015. Probablemente esté utilizando algo más del SDK de DirectX heredado en este proyecto, además de dxerr.
He implementado una versión de DXERR que puede compilar desde el origen en su proyecto para eliminar esta dependencia del DirectX SDK heredado. Vea deprecated para más detalles. Dicho esto, a propósito, solo era compatible con Unicode (la versión W). Puede encontrar la manera de hacer que ANSI (la versión A) sea lo suficientemente fácil, pero sería mejor si su aplicación se actualizara para usar Unicode.
Consulte ¿Dónde está el SDK de DirectX (Edición 2015)? y DXUT para Direct3D 11 .
ACTUALIZACIÓN: Como se señaló en otra respuesta, vincular con legacy_stdio_definitions.lib
debería hacer que la antigua versión de DirectX SDK de dxerr.lib
vuelva a vincular con VS 2015/2017. Dicho esto, debería trabajar para eliminar las dependencias del SDK de DirectX heredado tanto como sea posible y DXERR se puede reemplazar fácilmente por su propio módulo. Ver Vivir sin D3DX .
En lugar de hackear dxerr.lib manualmente, puedes agregar
#include <Windows.h>
#include <stdio.h>
int (WINAPIV * __vsnprintf)(char *, size_t, const char*, va_list) = _vsnprintf;
en algún lugar de tu código
Experimenté el mismo problema al usar DXGetErrorMessage()
con Dx9
y descubrí que MS ha proporcionado una biblioteca adicional para incluir en la página de propiedades de Additional Dependencies
para solucionar este problema. El nombre de la biblioteca es: legacy_stdio_definitions.lib
Añadir esto resolvió el problema para mí.
HACKY pero podrías parchear dxerr.lib.
Reemplace __vsnprintf con _vsnprintf (con un nulo al final para tener en cuenta el subrayado eliminado al principio)
Las bibliotecas de DirectX que está utilizando están compiladas con una versión anterior de Visual Studio que la que está usando. Microsoft a veces realiza cambios en su tiempo de ejecución de C, creando incompatibilidades entre bibliotecas compiladas con diferentes versiones. __vsnprintf
era un símbolo interno en versiones anteriores de su tiempo de ejecución de C, no existe en la versión 2015 de RC.
Desafortunadamente, dxerr.lib (junto con d3dx11.lib) ha quedado en deprecated . Tiene dos opciones: puede volver a VS2013 o puede dejar de usar la funcionalidad de dxerr.lib. El último es probablemente mejor, porque puedes duplicar su funcionalidad usando FormatMessage ahora (más información en el artículo vinculado).
Puede cambiar Platform Toolset de Visual Studio 2015 a Visual Studio 2013 y luego compilar. Platform Toolset se encuentra en la pestaña General de las Propiedades del proyecto.
solo agrega
#pragma comment(lib, "legacy_stdio_definitions.lib")