我在我们的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
标志?
答案 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
感到特别自信。