VS:如何配置DebugWithReleaseCrt

VS: How to configure DebugWithReleaseCRT?

本文关键字:配置 DebugWithReleaseCrt 何配置 VS      更新时间:2023-10-16

我在我们的cmake脚本中添加了一个新的配置DebugWithReleaseCRT,该配置基于漂亮的标准Debug配置,但与Release CRT链接(/MD而不是/MDd),并定义_ITERATOR_DEBUG_LEVEL=0。我检查了生成的项目文件设置,并且看起来不错:

c/c ->代码生成 -> runtimelibrary =多线程dll(/md)

但是,当我构建它时,我会得到以下错误:

3> 3rd-party.lib(3rd-party.obj):错误lnk2038:检测到的不匹配 对于'runtimelibrary':value'MD_DYNAMICREALESE'不匹配值 my.obj

中的'mdd_dynamicdebug'

我读为:

您的My.cpp文件与调试CRT编译 (MDd_DynamicDebug)当您尝试与库链接时 3rd-party.lib由发行版CRT(MD_DynamicRelease

构建

我还检查了此特定文件(My.cpp)设置,但那里没有任何幻想,它从父项目继承了/MD标志。

尽管有指定的/MD标志,为什么我的项目与调试CRT相关?

问题与vs precompiler定义有关_debug

当您指定/MTD或/MDD选项时,编译器定义_debug。 这些选项指定C运行时库的调试版本。

由于我的DebugWithReleaseCRT配置是基于Debug的,因此它也复制了_DEBUG定义。事实证明,如果将_DEBUG定义为Overrules /MD FLAG(MD_DynamicRelease),并且VS仍然与Debug CRT链接(Hey Visual Studio Team,这是一个惊喜!)。

通过从DebugWithReleaseCRT删除_DEBUG来解决该问题。实际上,它是通过用NDEBUG替换_DEBUG来解决的,因为某些第三方依赖项需要确定其中之一的定义。我仍然不确定这是一种配置DebugWithReleaseCRT的干净方法,我对在类型的调试配置中定义NDEBUG并不特别自信。