有没有办法同时包含 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
我最初以为是因为 WICTextureLoader
和 DDSTextureLoader
都包含相同的函数,所以当包含它们时它们“重叠”(即编译器检测到重定义)。
我正在使用批处理文件来编译我的项目,其中我针对 DirectXTex
和 DirectXTK
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.h
和 WICTextureLoader.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++ 运行时的“静态链接”版本构建。
除了“不是 VS”之外,您没有提到您使用的是什么编译器工具集。
请参阅 directx-vs-templates 以获得一堆 'basic device and present loop' 示例。如果您不使用 VS,该站点上有 'CMakeLists.txt' 可用。
我又一次被DirectXTex
和DirectXTK
弄糊涂了。
我通过以下方式解决了这个问题:
- 删除
DirectXTex
- 正在下载
DirectXTK
- 运行
DirectXTK_Desktop_2019_Win10
解决方案
- 将构建更改为
Release
和 x64
- 打开属性
- 寻找选项
Runtime Library
- 正在选择
Multi-threaded /MT
- 构建解决方案
在我的源文件中,我包括:
#include <WICTextureLoader.h>
和 #include <DDSTextureLoader.h>
我现在可以 link 生成静态库 directxtk.lib
,而不会出错。
加上。如果有人想使用 /NODEFAULTLIB:library
之类的东西,但你不使用 cl
或 Visual Studio
,你可以在你的源文件中使用 #pragma
指令,就像这样:
#pragma comment(linker, "/NODEFAULTLIB:MSVCRT")
我正在尝试加载 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
我最初以为是因为 WICTextureLoader
和 DDSTextureLoader
都包含相同的函数,所以当包含它们时它们“重叠”(即编译器检测到重定义)。
我正在使用批处理文件来编译我的项目,其中我针对 DirectXTex
和 DirectXTK
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.h
和 WICTextureLoader.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++ 运行时的“静态链接”版本构建。
除了“不是 VS”之外,您没有提到您使用的是什么编译器工具集。
请参阅 directx-vs-templates 以获得一堆 'basic device and present loop' 示例。如果您不使用 VS,该站点上有 'CMakeLists.txt' 可用。
我又一次被DirectXTex
和DirectXTK
弄糊涂了。
我通过以下方式解决了这个问题:
- 删除
DirectXTex
- 正在下载
DirectXTK
- 运行
DirectXTK_Desktop_2019_Win10
解决方案 - 将构建更改为
Release
和x64
- 打开属性
- 寻找选项
Runtime Library
- 正在选择
Multi-threaded /MT
- 构建解决方案
在我的源文件中,我包括:
#include <WICTextureLoader.h>
和 #include <DDSTextureLoader.h>
我现在可以 link 生成静态库 directxtk.lib
,而不会出错。
加上。如果有人想使用 /NODEFAULTLIB:library
之类的东西,但你不使用 cl
或 Visual Studio
,你可以在你的源文件中使用 #pragma
指令,就像这样:
#pragma comment(linker, "/NODEFAULTLIB:MSVCRT")