SpriteBatch 和 SpriteFont (DirectXTK) 抛出错误(预期的 unqualified-id)
Posted
技术标签:
【中文标题】SpriteBatch 和 SpriteFont (DirectXTK) 抛出错误(预期的 unqualified-id)【英文标题】:SpriteBatch and SpriteFont (DirectXTK) throw an error (expected unqualified-id) 【发布时间】:2020-08-12 18:21:28 【问题描述】:我正在使用链接到MSVC
的clang++
。
我编译了着色器 (DirectXTK\Shaders
) 并在我的源代码中包含了 SpriteBatch
和 SpriteFont
。
如果我只包含头文件 (.h
),则会出现链接错误;如果我包含源文件(.cpp
;有或没有.h
),我会得到:
SpriteBatch.cpp:532:27: error: expected unqualified-id
size_t newSize = std::max(InitialQueueSize, mSpriteQueueArraySize * 2);
^
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared\minwindef.h:193:29: note: expanded from macro 'max'
#define max(a,b) (((a) > (b)) ? (a) : (b))
我试图在 DirectXTK 的 GitHub 问题页面、本网站和网络上找到解决方案,但没有发现任何帮助。
【问题讨论】:
【参考方案1】:Windows 标头定义了一个“最小”和“最大”宏,与来自<algorithm>
的std::min
/std::max
交互不佳。
在我所有的模板和测试中,我在使用Windows.h
之前定义了NOMINMAX
以避免这个问题。这通常是一种更好的做法。如果在执行此操作时仍需要使用宏形式,可以使用__min
/_max
。
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#define NODRAWTEXT
#define NOGDI
#define NOBITMAP
#define NOMCX
#define NOSERVICE
#define NOHELP
#include <Windows.h>
见this other thread和this blog post
【讨论】:
谢谢,这解决了 min/max 的问题,但现在我收到来自SpriteBatch
和 SpriteFont
源文件的链接器错误。错误与外部符号有关,例如DirectX::BinaryReader
、struct ID3D11RasterizerState
等在函数中被引用,例如DirectX::SpriteBatch::Impl::PrepareForRendering(void)
和DirectX::SpriteFont::SpriteFont
。这些与我的代码无关,因为我注释掉了引用我的字体实现的部分。我错过了链接特定的静态库吗?
回答我的问题 - 是的,看来我还必须包括 BufferHelpers
、CommonStates
、VertexTypes
和 BinaryReader
。也许我错过了一些东西,但我不明白为什么我需要包含这些,因为我已经为我的编译器提供了这些文件的包含路径。
您的程序需要与静态库DirectXTK.lib
链接才能工作。如果您不使用 Visual Studio,请查看 CMakeLists.txt
了解构建详细信息。
我链接到DirectXTK.lib
(因为我使用的是纹理函数),但这似乎还不够,我在错误列表中添加了函数并包含了相应的源文件。 以上是关于SpriteBatch 和 SpriteFont (DirectXTK) 抛出错误(预期的 unqualified-id)的主要内容,如果未能解决你的问题,请参考以下文章
我如何找出一个字符串是否包含此SpriteFont无法解析的字符?