有没有办法同时包含 WICTextureLoader 和 DDSTextureLoader 而不会出现 'redefinition' 错误?

Is there a way to include both WICTextureLoader and DDSTextureLoader without 'redefinition' errors?

我正在尝试加载 DDS 纹理。为此,我使用 DirectXTex 提供的 DDSTextureLoader11。我已经在使用同一个库中的另一个纹理加载器 - WICTextureLoader11.

问题是,我在使用 WICTextureLoader11 时没有出错,但是当我只包含 DDSTextureLoader11 或同时使用它们时我确实会出错。

这是我在同时包含或只包含两者时遇到的一些错误 DDSTextureLoader11:

/WICTextureLoader11.cpp:51:17: error: redefinition of 'SetDebugObjectName'

/WICTextureLoader11.cpp:273:17: error: redefinition of 'MakeSRGB'

/WICTextureLoader11.cpp:747:17: error: no matching function for call to 'SetDebugObjectName'

/DDSTextureLoader.h:156:35: error: redefinition of default argument

我最初以为是因为 WICTextureLoaderDDSTextureLoader 都包含相同的函数,所以当包含它们时它们“重叠”(即编译器检测到重定义)。

我正在使用批处理文件来编译我的项目,其中我针对 DirectXTexDirectXTK link。我也尝试包含 DDSTextureLoader,但没有成功:我已经阅读了 DirectXTK 的 DDSTextureLoader 的 GitHub 页面,其中我包含 <DDSTextureLoader.h>,它给了我一个 link错误,我猜这与函数的错误调用有关CreateDDSTextureFromFile,所以现在我正在尝试找到一种方法来正确调用函数。

编辑: 不,我似乎在进行正确的函数调用。错误的是我试图包括 DDSTextureLoader.h,但它也想要 DDSTextureLoader.cpp。但是,当我包含 DDSTextureLoader.cpp 时会出现错误,例如:

'DDSTextureLoader.cpp': call to 'BitsPerPixel' is ambiguous -> 'DirectXTex.h''DDSTextureLoader' error: redefinition of 'SetDebugTextureInfo', previous definition in 'WICTextureLoader'.

我想,我需要的是包含 .cpp 文件,但要以某种方式消除错误。

Edit2: 到目前为止,我试图摆脱 DirectXTex(我什至不记得为什么我需要它),我已经包含了 WICTextureLoader.cpp DDSTextureLoader.cpp。我下载并构建了 DirectXTK 库,然后包含 #pragma comment(lib, "directxtk.lib")。现在,奇怪的是:当我用 Clang++ 编译时,它不会抛出任何错误(但程序在 second-long 灰屏后崩溃),但是当我用 cl 编译时(通过 vcvars64),我得到 fatal error LNK1104: cannot open file 'directxtk.lib'.

Edit3: 等等,我什至不知道为什么我需要 directxtk.lib。所以我删除了它,它编译了,但没有任何效果。我认为在尝试包含 header(XXXTextureLoader.h)而不是源代码(XXXTextureLoader.cpp)时我需要静态库来解决外部符号错误。

Edit4: 等等,等等,等等。我想,我要疯了。现在,如果我只包含 WICTextureLoader.cpp(并删除 DDSTextureLoader.cpp),它会给我这个错误:(directxtk.lib) mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'。我不知道我为什么那样做,但我现在疯了,我盲目地 brute-force 解决了这个该死的问题。 为什么我不能将两个 header 都放在我的目录中并简单地包含它们? 有办法吗?我应该怎么办?为什么 GitHub 上的 DirectXTK/Tex 页面不提供 step-by-step 如何使用这些东西的指南? 这些例子让我抓狂!

请帮我解决这个看似简单的问题。

Edit5: 我尝试的最后一件事是包含 DDSTextureLoader.hWICTextureLoader.h,并使用 directxtk.lib,但它给了我这些错误:

directxtk.lib(DDSTextureLoader.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main-3dacd8.o

directxtk.lib(pch.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main-3dacd8.o

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library

我不会用VS,所以不知道怎么用/NODEFAULTLIB

使用 WIC 加载 DDS 和其他图像文件有以下三种选择:

  • 使用 DirectXTex(库)

  • 使用DDSTextureLoader/WICTextureLoader(单机版)

  • 或使用 DirectX 工具包(库)。

没有理由在同一个程序中使用多个,如果你尝试的话会发生冲突。参见 this post

除非您正在编写纹理处理工具,或者需要支持过多的传统 DDS 像素格式,否则使用 DirectX 工具包 通常是最简单的。 DirectX 工具包 tutorials 很好地涵盖了这一点。

您收到的错误表明使用 Visual C++ 的一些更基本的内容。 DirectXTex、DirectXTK 库使用推荐的 C/C++ 运行时版本的“多线程 DLL”构建(即 /MDd/MD)。

该错误表明您的程序正在使用 C/C++ 运行时的“静态链接”版本构建。

Microsoft Docs

除了“不是 VS”之外,您没有提到您使用的是什么编译器工具集。

请参阅 directx-vs-templates 以获得一堆 'basic device and present loop' 示例。如果您不使用 VS,该站点上有 'CMakeLists.txt' 可用。

我又一次被DirectXTexDirectXTK弄糊涂了。

我通过以下方式解决了这个问题:

  1. 删除DirectXTex
  2. 正在下载DirectXTK
  3. 运行 DirectXTK_Desktop_2019_Win10 解决方案
  4. 将构建更改为 Releasex64
  5. 打开属性
  6. 寻找选项Runtime Library
  7. 正在选择Multi-threaded /MT
  8. 构建解决方案

在我的源文件中,我包括: #include <WICTextureLoader.h>#include <DDSTextureLoader.h>

我现在可以 link 生成静态库 directxtk.lib,而不会出错。

加上。如果有人想使用 /NODEFAULTLIB:library 之类的东西,但你不使用 clVisual Studio,你可以在你的源文件中使用 #pragma 指令,就像这样:

#pragma comment(linker, "/NODEFAULTLIB:MSVCRT")