C++ 有没有一种方法可以同时包含WictTextureLoader和DDSTextureLoader而不使用';重新定义';错误?
我正在尝试加载DDS纹理。为此,我使用的是C++ 有没有一种方法可以同时包含WictTextureLoader和DDSTextureLoader而不使用';重新定义';错误?,c++,directx,directx-11,C++,Directx,Directx 11,我正在尝试加载DDS纹理。为此,我使用的是DirectXTex提供的ddssTextureLoader11。我已经在使用同一个库中的另一个纹理加载程序-WICTextureLoader11 问题是,WICTextureLoader11不会出现错误,但是如果只包含ddstructureloader11,或者同时使用这两个工具,就会出现错误 这是我在同时包含或仅包含DDSTextureLoader11时遇到的一些错误: /WICTextureLoader11.cpp:51:17:错误:重新定义“Se
DirectXTex
提供的ddssTextureLoader11
。我已经在使用同一个库中的另一个纹理加载程序-WICTextureLoader11
问题是,WICTextureLoader11
不会出现错误,但是如果只包含ddstructureloader11
,或者同时使用这两个工具,就会出现错误
这是我在同时包含或仅包含DDSTextureLoader11
时遇到的一些错误:
/WICTextureLoader11.cpp:51:17:错误:重新定义“SetDebugObjectName”
/WICTextureLoader11.cpp:273:17:错误:重新定义“MakeSRGB”
/WICTextureLoader11.cpp:747:17:错误:调用“SetDebugObjectName”时没有匹配的函数。
/ddstructureloader.h:156:35:错误:重新定义默认参数
我最初认为这是因为WICTextureLoader
和ddstructureloader
都包含相同的函数,所以当包含这两个函数时,它们“重叠”(即编译器检测到重新定义)
我使用一个批处理文件来编译我的项目,在这里我链接到DirectXTex
和DirectXTK
。我还试图包含DDSTextureLoader
,但没有成功:我已经阅读了DirectXTK的DDSTextureLoader
的GitHub页面,其中包含了
,它会给我一个链接错误,我想这与函数CreateDDSTextureFromFile
的错误调用有关,所以现在我正试图找到一种方法来正确调用函数
编辑:不,似乎我正在进行正确的函数调用。错误的是,我试图包括ddstureloader.h
,但它也需要ddstureloader.cpp
。但是,当我包含ddssetureloader.cpp
时会出现错误,例如:
'DDSTextureLoader.cpp':对“BitsPerPixel”的调用不明确->'DirectXTex.h'
或'DDSTextureLoader'错误:重新定义了“SetDebugTextureInfo”,之前在“WictTextureLoader”中的定义。
我想,我需要的是包含.cpp
文件,但要以某种方式消除错误
Edit2:到目前为止,我试图摆脱DirectXTex(我甚至不记得为什么需要它),我已经包括了WICTextureLoader.cpp
和ddstructureLoader.cpp
。我下载并构建了DirectXTK库,然后包括#pragma注释(lib,“DirectXTK.lib”)
。现在,奇怪的是:当我用Clang++
编译时,它不会抛出任何错误(但程序在第二个长灰色屏幕后崩溃),然而当我用cl
编译时(通过vcvars64
),我得到了致命错误LNK1104:无法打开文件'directxtk.lib'
Edit3:等等,我甚至不知道为什么我需要directxtk.lib
。所以我删除了它,并编译了它,但没有任何效果。我认为在尝试包含头(xxxtureLoader.h
)而不是源(xxxtureLoader.cpp
)时,我需要该静态库来解决外部符号错误
Edit4:等等,等等,等等。我想,我快疯了。现在,如果我只包括WICTextureLoader.cpp
(并删除ddstureloader.cpp
),它会给我以下错误:(directxtk.lib)检测到“RuntimeLibrary”不匹配:值“MD_DynamicRelease”与值“MT_StaticRelease”不匹配
。我不知道我为什么这么做,但我现在疯了,我盲目地用暴力解决这个该死的问题。为什么我不能把这两个头都扔到我的目录中,然后简单地包含它们呢?有没有办法做到这一点?我该怎么办?为什么GitHub上的DirectXTK/Tex页面不提供如何使用这些东西的分步指南?这些例子让我发疯
请帮我解决这个看似简单的问题
Edit5:我尝试的最后一件事是包括ddstructureLoader.h
和WICTextureLoader.h
,并使用directxtk.lib
,但它给了我以下错误:
directxtk.lib(DDSTextureLoader.obj):错误LNK2038:检测到“RuntimeLibrary”不匹配:值“MD\u DynamicRelease”与main-3dacd8.o中的值“MT\u StaticRelease”不匹配
directxtk.lib(pch.obj):错误LNK2038:检测到“RuntimeLibrary”不匹配:值“MD_dynamicCrease”与main-3dacd8.o中的值“MT_StaticRelease”不匹配
链接:警告LNK4098:defaultlib'MSVCRT'与其他lib的使用冲突;使用/NODEFAULTLIB:library
我不使用VS,因此我不知道如何使用/NODEFAULTLIB
使用WIC加载DDS和其他图像文件有三种选择:
- 使用DirectXTex(库)
- 使用DDSTureLoader/WictTextureLoader(独立版本)
- 或者使用DirectX工具包(库)
没有理由在同一个程序中使用它们中的一个以上,如果您尝试,就会发生冲突。看
除非您正在编写纹理处理工具,或者需要支持过多的传统DDS像素格式,否则使用DirectX工具包通常是最简单的。for DirectX工具包很好地涵盖了这一点
你所得到的错误表明使用VisualC++的一些更基本的东西。DirectXTex、DirectXTK库使用推荐的C/C++运行时的“多线程DLL”版本(即
/MDd
和/MD
)构建
该错误表示您的程序正在使用“静态链接”版本的C/C++运行时生成
看
除了“非VS”之外,您没有提到您正在使用的编译器工具集
请参阅,以获取一系列“基本”信息