VS:如何配置DebugWithReleaseCRT?

时间:2017-11-22 19:50:28

标签: c++ c visual-studio visual-studio-2015 cmake

我在我们的CMake脚本中添加了一个新配置DebugWithReleaseCRT,该脚本基于非常标准的Debug配置,但与发布CRT(/MD而不是/MDd)相关联,并且定义_ITERATOR_DEBUG_LEVEL=0。我检查了生成的项目文件设置,看起来都很好:

  

C / C ++ - >代码生成 - > RuntimeLibrary =多线程DLL(/ MD)

然而,当我构建它时,我得到的错误如下:

  

3> 3rd-party.lib(3rd-party.obj):错误LNK2038:检测到不匹配   对于' RuntimeLibrary&#39 ;:值' MD_DynamicRelease'不匹配价值   ' MDd_DynamicDebug'在My.obj

我读作:

  

您的My.cpp文件是使用调试CRT编译的   (MDd_DynamicDebug),而您正在尝试与图书馆建立链接   使用版本CRT(3rd-party.lib

构建的MD_DynamicRelease

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

为什么我的项目与Debug CRT链接,尽管指定了/MD标志?

1 个答案:

答案 0 :(得分:0)

问题与VS预编译器定义_DEBUG

有关
  

当您指定/ MTd或/ MDd选项时,编译器会定义_DEBUG。   这些选项指定C运行时库的调试版本。

由于我的DebugWithReleaseCRT配置基于Debug,因此它也复制了_DEBUG定义。事实证明,如果_DEBUG被定义,它会否决/MD标志(MD_DynamicRelease),VS仍然会与调试CRT链接(嘿,Visual Studio团队,这是一个惊喜!)。

通过从_DEBUG移除DebugWithReleaseCRT来解决问题。实际上,它是通过_DEBUG替换NDEBUG来解决的,因为某些第三方依赖项只需要定义其中一个。我仍然不确定这是一种配置DebugWithReleaseCRT的简洁方法,我对在调试配置中定义NDEBUG感到特别自信。