Неразрешенный внешний символ __vsnprintf.... (в dxerr.lib)?

Я запускаю приложение DirectX 11 в Windows 7 и visual studio community 2015 RC. Я все еще использую функции из DX SDK. Он отлично работал на VS2013, но когда я переключился, я получил только следующую ошибку:

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

Я использую только функцию DXGetErrorDescriptionA из библиотеки dxerr, и когда я ее прокомментирую, программа компилируется отлично. Я понятия не имею, что не так, но это не может быть из DX SDK или иначе другие функции не сработают правильно?

Ответ 1

У меня возникла такая же проблема, используя DXGetErrorMessage() с Dx9 и выяснилось, что MS предоставила дополнительную библиотеку для включения в страницу свойств Additional Dependencies для решения этой проблемы. Имя библиотеки: legacy_stdio_definitions.lib

Добавление этого разрешено для меня.

Ответ 2

Вместо того чтобы взломать dxerr.lib вручную, вы можете добавить

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

где-то в вашем коде

Ответ 3

Библиотеки DirectX, которые вы используете, скомпилированы с более старой версией Visual Studio, чем вы используете. Microsoft иногда вносит изменения в свою C-среду выполнения, создавая несовместимость между библиотеками, скомпилированными с различными версиями. __vsnprintf был внутренним символом в более ранних версиях их времени выполнения C, он не существует в версии RC 2015.

К сожалению, dxerr.lib(вместе с d3dx11.lib) устарел. У вас есть два варианта: вы можете переключиться на VS2013, или вы можете прекратить использовать функции из dxerr.lib. Последнее, вероятно, лучше, потому что вы можете дублировать его функциональность, используя FormatMessage сейчас (дополнительная информация в связанной статье).

Ответ 4

HACKY, но вы можете исправить dxerr.lib.

Замените __vsnprintf на _vsnprintf (с нулевым в конце, чтобы учесть удаленное подчеркивание в начале)

Ответ 5

Унаследованный DirectX SDK довольно старый, а dxerr.lib в DXSDK несовместим со временем выполнения VS 2015 C, как вы столкнулись.

В общем, статические библиотеки с кодом в них не очень хорошо смешиваются с разными версиями компилятора. Большинство .libs в унаследованном DirectX SDK работают с VS 2015, потому что они являются библиотеками импорта для библиотек DLL или всех библиотек данных и поэтому не содержат никакого кода. DXSDK не обновлялся со времен VS 2010.

Обязательно прочитайте инструкции по MSDN по правильному сочетанию устаревшего пакета DirectX SDK с SDK Windows 8.x используется VS 2015. Вы предположительно используете что-то еще из унаследованного DirectX SDK в этом проекте, кроме dxerr.

Я реализовал версию DXERR, которую вы можете создать из исходного кода в своем проекте, чтобы удалить эту зависимость от устаревшего DirectX SDK. Подробнее см. этот пост. Тем не менее, я намеренно поддерживал только Unicode (версия W). Вы можете решить, как сделать ANSI (версию A) достаточно легко, но было бы лучше, если бы обновляло ваше приложение для использования Unicode.

См. Где находится DirectX SDK (версия 2015)? и DXUT для Direct3D 11.

ОБНОВЛЕНИЕ: Как уже упоминалось в другом ответе, связанным с legacy_stdio_definitions.lib, необходимо снова добавить старую версию DirectX SDK версии dxerr.lib с VS 2015/2017. Тем не менее, вы должны как можно больше работать над удалением зависимостей от устаревшего SDK DirectX, и DXERR легко заменяется вашим собственным модулем. См. Жизнь без D3DX.

Ответ 6

Вы можете изменить набор инструментов платформы от Visual Studio 2015 до Visual Studio 2013, а затем скомпилировать. Набор инструментов платформы находится на вкладке "Общие" свойств проекта.