【问题标题】:Why are my project settings conflicting in Release mode?为什么我的项目设置在发布模式下会发生冲突?
【发布时间】:2021-01-10 00:34:54
【问题描述】:

我正在尝试为我的项目使用 DirectXTex 库。我从 GitHub 克隆了它,并使用适用于桌面的 Visual Studio 2019 解决方案构建它,其代码生成设置与我自己的项目中完全相同。它适用于调试配置,但是当我在 release 上构建时,会出现类似于此的错误消息:

_ITERATOR_DEBUG_LEVEL: Value 2 of (some DirectXTex .obj) is conflicting with value 0 of (my own .obj)

伴随着这条消息:

Runtime library: MTd_StaticDebug of (some DirectXTex .obj) is conflicting with MT_StaticRelease of (my own .obj)

这很奇怪,因为我将两个项目的运行时库都设置为多线程 (/MT) 用于发布和多线程调试 (/MTd) 用于调试。我做了一些研究,发现 this 文章涵盖了这个确切的问题,但这些解决方案都不适合我。我尝试了以下方法:

  • 查看是否出于某种原因在 DirectXTex 的发布模式构建中定义了 _DEBUG 预处理器(不是)
  • 尝试将两个项目设置都设置为多线程 DLL
  • 检查所有代码生成设置是否真的相同(调试和发布)
  • 检查我是否使用正确的库构建进行调试和发布
  • 创建一个干净的新版本,以防我的 .obj 文件是旧版本

这些都不起作用。但是,如果我将自己项目的运行时库设置为 Multithreaded-Debug 用于发布模式,它可以编译并正常发布。这显然不是一个理想的解决方案。

我也不明白的是 DirectXTex 库似乎使用 MT_StaticDebug 构建 DirectXTex 的发布配置(至少错误消息表明),尽管我明确将其运行时库设置为多线程 (/MT) 以进行发布.我该如何解决这个问题?

【问题讨论】:

  • 我认为错误信息很清楚:DirectXTex 在调试模式下编译(NDEBUGRELEASE 未定义)并链接调试运行时。
  • @user7860670 但是 NDEBUG 是在 Release 中定义的,只是 _DEBUG 没有定义,应该是这样。我的问题是我用 /MT 显式编译 DirectXTex,但不知何故,DirectXTex .objs 似乎是用 /MTd 编译的。我还在我的项目中链接到库的发布版本。我可以检查库或我的项目中是否有任何可能的链接器选项?

标签: c++ visual-studio directx linker-errors msdn


【解决方案1】:

GitHub repo 中的DirectXTex_Desktop_2019.vcxproj 设置为使用/MDd 用于调试/MD 用于发布。出于多种原因,建议使用基于 DLL 的 Visual C++ 运行时而不是静态 CRT 链接。

话虽如此,如果您使用的是静态链接,那么您应该验证每个平台/配置组合中的设置是否正确,因为您似乎没有在所有调试配置案例中设置/MTd。例如,您的项目中是否同时具有 x86 和 x64 平台?

【讨论】:

  • 原来我的配置是正确的,但是当我更改项目设置时,Visual Studio 没有正确更新 .vxproj 文件。手动更改 .vxproj 中的设置解决了问题。
  • 我最近在尝试一次设置多个配置/平台组合时注意到“项目设置”对话框存在一些问题,所以这可能就是发生在您身上的事情。
  • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多