web-dev-qa-db-fra.com

Symbole externe non résolu __vsnprintf .... (dans dxerr.lib)?

J'exécute une application DirectX 11 sur Windows 7 et Visual Studio Community 2015 RC. J'utilise toujours les fonctions du SDK DX. Cela a bien fonctionné sous VS2013, mais lorsque j'ai basculé, je ne reçois que l'erreur suivante:

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

J'utilise uniquement la fonction DXGetErrorDescriptionA de la bibliothèque dxerr et, lorsque je la commente, le programme se compile correctement. Je n'ai aucune idée de ce qui ne va pas, mais cela ne peut pas provenir du SDK DX ou les autres fonctions échoueraient correctement?

17
Moody

J'ai rencontré le même problème en utilisant DXGetErrorMessage() avec Dx9 et ai découvert que MS avait fourni une bibliothèque supplémentaire à inclure dans la page de propriétés Additional Dependencies pour résoudre ce problème. Le nom de la bibliothèque est: legacy_stdio_definitions.lib

Ajouter ceci a résolu le problème pour moi.

35
LaurieW

Au lieu de pirater manuellement dxerr.lib, vous pourriez ajouter

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

quelque part dans votre code

20
user5477957

il suffit d'ajouter

#pragma comment(lib, "legacy_stdio_definitions.lib")

https://msdn.Microsoft.com/en-us/library/bb531344.aspx

5
Masaki Ohashi

Les bibliothèques DirectX que vous utilisez sont compilées avec une version de Visual Studio plus ancienne que celle que vous utilisez. Microsoft apporte parfois des modifications à leur runtime C, créant des incompatibilités entre les bibliothèques compilées avec différentes versions. __vsnprintf était un symbole interne dans les anciennes versions de leur environnement d'exécution C, il n'existe pas dans la version 2015 de RC. 

Malheureusement, dxerr.lib (avec d3dx11.lib) a été obsolète . Vous avez deux options: vous pouvez revenir à VS2013 ou cesser d'utiliser les fonctionnalités de dxerr.lib. Ce dernier est probablement meilleur, car vous pouvez dupliquer ses fonctionnalités en utilisant FormatMessage now (plus d’informations dans l’article lié). 

4
MuertoExcobito

Le SDK DirectX hérité est assez ancien et dxerr.lib dans le DXSDK n’est pas compatible avec le runtime C de VS 2015 que vous avez rencontré.

En général, les bibliothèques statiques contenant du code ne se mélangent pas bien à partir de versions différentes du compilateur. La plupart des fichiers .lib du kit de développement DirectX SDK hérité fonctionnent avec VS 2015 car ce sont des bibliothèques d'importation pour les DLL ou toutes les bibliothèques de données et ne contiennent donc aucun code. Le fichier DXSDK n'a pas été mis à jour depuis VS 2010.

Assurez-vous de lire les instructions sur MSDN sur la bonne façon de mélanger le SDK DirectX hérité avec le SDK Windows 8.x utilisé par VS 2015. Vous utilisez probablement quelque chose du SDK hérité DirectX dans ce projet. à part dxerr.

J'ai implémenté une version de DXERR que vous pouvez créer à partir des sources dans votre projet pour supprimer cette dépendance du SDK DirectX hérité. Voir cet article pour plus de détails. Cela dit, je n'ai volontairement pris en charge que l'Unicode (version W). Vous pouvez trouver un moyen de créer assez facilement l’ANSI (version A), mais il serait préférable que votre application soit mise à jour pour utiliser Unicode.

Voir Où se trouve le SDK DirectX (édition 2015)? et DXUT pour Direct3D 11 .

UPDATE: Comme indiqué dans une autre réponse, la liaison avec legacy_stdio_definitions.lib devrait faire en sorte que l'ancienne version du kit de développement DirectX SDK héritée de dxerr.lib soit à nouveau liée à VS 2015/2017. Cela dit, vous devez supprimer autant que possible les dépendances sur le SDK DirectX hérité et DXERR est facilement remplacé par votre propre module. Voir Vivre sans D3DX .

3
Chuck Walbourn

HACKY mais vous pouvez corriger dxerr.lib. 

Remplacez __vsnprintf par _vsnprintf (par un null à la fin pour prendre en compte le soulignement de soulignement supprimé au début)

2
cgp1024

Vous pouvez modifier le Platform Toolset de Visual Studio 2015 vers Visual Studio 2013, puis il compile . Le Platform Toolset se trouve sous l'onglet Général des propriétés du projet.

1
Raymond Trel