如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?

Posted

技术标签:

【中文标题】如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?【英文标题】:How to make Visual Studio (2019/2022) link to the normal runtime libraries during a debug build? 【发布时间】:2021-11-30 13:32:03 【问题描述】:

我想这样做的原因是调试库中充斥着额外的“断言”语句,这些语句在远程调试期间需要很长时间才能开始。

我希望只是在Code Generation 中用Multi-threaded DLL (/MD) 替换Multi-threaded Debug DLL (/MDd) -> Runtime Library 但我想知道是否还需要考虑其他更改?

【问题讨论】:

嗯。将运行时库更改为非调试版本真的有效吗?我想可能会缺少“调试相关”符号,或者您的基础项目引用的一些符号。 ... 或者可能是关于 _debug_level_ 之类的错误值的运行时错误? 好吧,理论上我希望它应该只为本地应用程序存储调试符号并调用正常的运行时库。我的意思是调用调试库或普通库与调用顺序和参数无关。我会试一试,但遇到了一些奇怪的错误,例如error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL' 是的 - 这种不匹配是我在第二条评论中提到的错误。不记得这个符号实际上叫什么。可能有一种解决方法,通过强制将该符号的值设置为它需要的值,但我不知道该怎么做。也许谷歌那个符号,或者在这里寻找它? 我会用完全干净的重建再试一次,但它是一个相当大的代码库,所以可能需要一段时间。除了强制 _ITERATOR_DEBUG_LEVE 之外,知道如何欺骗链接器使用正常的运行时库吗? 【参考方案1】:

这对于远程调试大型和复杂的应用程序是可行的,也是很好的做法,Mixing debug and release library/binary - bad practice? 中也有说明。

除了将链接库从 Multi-threaded Debug DLL (/MDd) 切换到 Multi-threaded DLL (/MD) 之外,还需要考虑像 _ITERATOR_DEBUG_LEVEL 这样的调试宏,否则在链接期间可能会发生冲突。指示此类冲突的典型错误消息是error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL'

一旦解决了所有冲突的宏,它将链接到标准运行时库,但应用程序的调试符号仍然存在。

另外,@Adrian Mole 感谢在这件事上的协助。

【讨论】:

以上是关于如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 构建期间构建节点项目,与 C# 项目分开?

是啥导致 Visual Studio 调试器使某些问题无法重现?

在 Visual Studio 调试期间从哪里加载 user.config

如何仅为调试构建运行 Visual Studio 构建后事件

调试期间在 Visual Studio 中自动附加到子进程

在 Visual Studio 调试期间无法连接到 Oracle 数据库