未解析的外部符号__vsnprintf ....(在dxerr.lib中)?

Moo*_*ody 27 directx windows-7 visual-studio-2015

我在Windows 7和Visual Studio社区2015 RC上运行DirectX 11应用程序.我还在使用DX SDK中的功能.它在VS2013上工作正常但是当我切换时我只得到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我只使用dxerr库中的DXGetErrorDescriptionA函数,当我将它注释掉时,程序编译得很好.我不知道出了什么问题,但它不能来自DX SDK,否则其他功能会失败吧?

小智 54

我遇到了同样的问题DXGetErrorMessage(),Dx9并发现MS提供了一个额外的库,包含在Additional Dependencies属性页面中以解决这个问题.库名是:legacy_stdio_definitions.lib

添加这个解决了我的问题.

  • 再次感谢上帝赐予 StackOverflow。微软在“_vsnprintf”网页上提到这一点是不是要求太高了? (5认同)
  • 我投赞成票。谢谢 LaurieW。其他文章可以在这里找到:https://msdn.microsoft.com/en-us/library/bb531344.aspx (4认同)

小智 23

您可以添加,而不是手动黑客攻击dxerr.lib

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

你代码中的某个地方


Chu*_*urn 5

旧版 DirectX SDK 已经很旧了,并且dxerr.lib在 DXSDK 中与您遇到的 VS 2015 的 C 运行时不兼容。

一般来说,包含代码的静态库不能与不同版本的编译器很好地混合。旧版 DirectX SDK 中的大多数 .lib 都适用于 VS 2015,因为它们是 dll 或所有数据库的导入库,因此根本不包含任何代码。DXSDK 自 VS 2010 以来未更新。

旁白:VS 团队做出了英勇的努力,以根据Microsoft Docs保持 Visual C/C++ 运行时链接在 VS 2015 Update 3、VS 2017 和 VS 2019 之间兼容。这不是正常模式。

请务必阅读Microsoft Docs上有关将旧版 DirectX SDK 与 VS 2015 使用的 Windows 8.x SDK 混合的正确方法的说明。您可能在此项目中使用了旧版 DirectX SDK 中的其他内容,除了 dxerr。

我已经实现了一个 DXERR 版本,您可以从项目中的源代码构建该版本,以删除旧版 DirectX SDK 的这种依赖性。看到这个帖子详细信息,。也就是说,我特意只支持 Unicode(W 版本)。您可以很容易地弄清楚如何制作 ANSI(A 版本),但最好将您的应用程序更新为使用 Unicode。

请参阅DirectX SDK(2021 版)在哪里?用于 Direct3D 11 的 DXUT

更新:如另一个答案中所述,链接legacy_stdio_definitions.lib应该使旧的旧版 DirectX SDK 版本dxerr.lib再次与 VS 2015/2017 链接。也就是说,您应该尽可能地消除对旧版 DirectX SDK 的依赖,并且 DXERR 很容易被您自己的模块替换。请参阅没有 D3DX 的生活