Visual Studio中/MD /MDd /MT /MTd的含义以及_ITERATOR_DEBUG_LEVEL错误的解决方法

error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” 报错: error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” 解决: 工程的模式和库的模式不一致,工程为Debug模式,引用了Release模式下生成的库。 将当前的Debug模式改为Release模式。 报错: error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2” 阅读详情

先上结论,如果你遇到了_ITERATOR_DEBUG_LEVEL doesnt match error,那一定是你链接的库的DEBUG或RELEASE版本与你当前的项目活动配置不符。不同的值代表的含义如下:

_ITERATOR_DEBUG_LEVEL = 0 (in release mode)
_ITERATOR_DEBUG_LEVEL = 1 (in release mode if _SECURE_SCL is defined)
_ITERATOR_DEBUG_LEVEL = 2 (in debug mode)

网上流行的答案都是说在“项目属性/配置属性/ C,C++/预处理器/预处理器定义”这里加上"_ITERATOR_DEBUG_LEVEL=0或2"。但是这样的做法并不总是见效,我认为可以补充一种方法:

首先看清楚你现在的项目活动配置是DEBUG还是RELEASE,假设为RELEASE,也就是你现在要生成RELEASE版本的解决方案,那么再到“项目属性/配置属性/ C,C++/代码生成/运行库”这里看看你选择的是不是“多线程调试(/MTd)”或者“多线程调试DLL(/MDd)”,如果是的话,那就很简单了,既然你要生成RELEASE版本的解决方案,当然不能用调试版本的运行库了,所以相应的改为/MT或/MD即可。反之亦然。

那么/MTd /MDd /MT /MD又都是什么含义呢?其实MSDN上就有答案。开宗明义一句话:这些选项允许你选择运行时库是静态库还是动态库,是debug版还是release版。

所谓动态库,即DLL(Dynamic Link Library )。DLL是一个包含可由多个程序同时使用的代码和数据的库,而不是可执行文件。动态链接提供了一种方法使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。一般生成动态库后会产生两个文件即DLL文件和对应DLL文件的LIB文件,其中DLL文件存储了具体的程序,而LIB文件只是这些程序的一个目录或者说是索引。当调用DLL文件时,需要在“项目属性/配置属性/链接器/输入”中加载对应DLL的LIB文件。

所谓静态库就是.lib文件,库中的代码最后需要连接到可执行文件中去,所以静态连接的可执行文件一般比较大一些。静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。因此这也导致了使用静态库程序偏大的原因。

静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的复本,因此节省了很多内存。

再来详细的看看各选项的含义,想必就很好理解了:

/MD

使应用程序使用运行库的多线程并特定于 DLL 的版本。 定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
用此选项编译的应用程序静态链接到 MSVCRT.lib。 此库提供允许链接器解析外部引用的代码的层。 实际工作代码包含在 MSVCR100.DLL, 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。

/MDd

定义 _DEBUG、_MT 和 _DLL,并使应用程序使用运行库的调试多线程并特定于 DLL 的版本。 它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。

/MT

使应用程序使用运行库的多线程静态版本。 定义 _MT 并使编译器将LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。

/MTd

定义 _DEBUG 和 _MT。 此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。

要注意的是:

传递给链接器的给定调用的所有模块都必须使用相同的运行库编译器选项(/MD、/MT)进行编译即不要混合使用库的静态版本和动态版本。关于这一点的demo参见这里。

 

关注公众号,掌握更多多媒体领域知识与资讯

文章帮到你了?可以扫描如下二维码进行打赏~,打赏多少您随意~

 

关于使用VS2015静态编译 首先必须搞清楚项目->项目属性->配置属性->C/C++->代码生成->运行库中四个选项的关系: 多线程调试Dll (/MDd) 对应MD_DynamicDebug 多线程Dll (/MD) 对应MD_DynamicRelease 多线程(/MT) 对应MD_StaticRelease 多线程(/MTd)对应MD_StaticDebug 在msdn中有详细解释: http://msdn. 阅读详情

相关推荐

Visual Studio C++报错全解析:从编译链接到运行时错误的系统化解决方案

在C++开发中,编译与链接是构建程序的基础环节。编译阶段负责检查代码语法和语义,确保符合C++标准;链接阶段则将多个目标文件与库文件合并,形成最终可执行文件。理解这两大阶段的原理,对于构建稳定、高效的软件至关重要。在实际工程实践中,Visual Studio作为主流的C++开发环境,其报错信息是诊断问题的重要线索。例如,编译期常见的C2065“未声明的标识符”错误,往往源于变量作用域或头文件包含问题;而链接期的LNK2005“符号重复定义”错误,则多与全局变量或函数在头文件中的不当定义有关。这些错误不仅影响

weixin_30788239的博客 343

解决:检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2””。

_ITERATOR_DEBUG_LEVEL相关问题

qq_41507735的博客 8901

Visual Studio C++项目“开始执行”按钮消失?MSB8020错误与平台工具集配置详解

在C++项目开发中,构建环境配置是确保项目顺利编译和运行的基础。平台工具集作为Visual Studio的核心组件,包含了特定版本的编译器、链接器和库文件,其作用类似于项目的“发动机”与“装配线”,直接决定了源代码能否被正确转换为可执行程序。当项目配置的平台工具集版本与本地开发环境不匹配时,就会触发MSB8020错误,导致IDE出于安全考虑禁用“开始执行”和“开始调试”等关键功能按钮,严重影响开发流程。理解平台工具集的原理与诊断方法,不仅能快速解决按钮消失问题,更是管理复杂C++项目依赖、保障团队协作环境一

weixin_30788619的博客 342

【CMake报错】“检测到_ITERATOR_DEBUG_LEVEL和RuntimeLibrary不匹配” 的解决方案

使用特定的库文件或需要更精确地控制编译过程时,显式设置编译选项和定义是一种好的做法。

测试开发自动化 3516

VS2017集成Crypto++库与AES-CBC加解密实战指南

对称加密是保障数据机密性的核心技术,其中AES(高级加密标准)作为当前全球最主流的算法,广泛应用于HTTPS、数据库加密及安全通信协议中。其原理基于分组密码,通过多轮替换和混淆操作对固定长度数据块进行处理,而CBC(密码块链接)等模式则解决了对长数据流的加密问题,通过引入初始化向量(IV)增强了安全性。在工程实践中,Crypto++库以其模块化设计和丰富的算法支持,成为C++开发者实现密码学功能的强大工具。本文将聚焦于在Visual Studio 2017开发环境中,从编译配置、项目集成到代码实现,详细讲解

csdn785029689的博客 432

QT(C++)-error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”

在VS中采用QT(C++)调试时,出现error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”错误。

GimiGimmy 2409

error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2

Debug和Realse附加依赖项区别。

面条有点辣 3394

Python入门之机器学习(非常详细)篇幅拉满,一般人看不完!

什么是机器学习?监督学习 supervised learning;非监督学习 unsupervised learning;半监督学习 semi-supervised learning;强化学习 reinforcement learning;监督学习是不断向计算机提供数据(特征),并告诉计算机对应的值(标签),最后通过大量的数据,让计算机自己学会判断和识别。例如Google Photo,你在APP中输入狗,这时就会弹出与狗相关的图片,这背后使用的算法就是监督学习。

xiaolinyui的博客 2万+

UE5 C++项目升级Visual Studio后编译失败的系统性解决方案

在C++游戏开发中,工具链的版本兼容性是保障项目顺利构建的核心基础。其原理在于,编译器、链接器、运行时库等工具链组件需要与项目构建配置精确匹配,否则会导致编译或链接错误。对于使用虚幻引擎5(UE5)进行C++开发的团队而言,维护工具链的稳定与兼容具有重要技术价值,它直接决定了开发效率、项目可维护性以及跨团队协作的流畅性。当开发环境升级,例如从Visual Studio 2019迁移至Visual Studio 2022时,常见的应用场景便是MSVC工具集版本、项目文件路径、环境变量等环节出现不匹配,从而引发

dengjuanshou7445的博客 499

R语言pls包实战:手把手教你用偏最小二乘(PLS)搞定高维数据回归(附完整代码与数据标准化避坑指南)

本文详细介绍了如何使用R语言的pls包进行偏最小二乘(PLS)回归分析,特别针对高维数据回归问题。通过完整的代码示例和数据标准化避坑指南,帮助读者掌握从数据预处理到模型优化的全流程,解决实际应用中的常见问题。

weixin_42662605的博客 352

多GPU时代的虚拟内存革命:CUDA VMM API的跨设备协同设计哲学

本文深入探讨了NVIDIA CUDA VMM API在多GPU系统中的虚拟内存管理革命,解决了传统Peer Access的显存碎片化和同步开销问题。通过地址-内存解耦、按需映射和精细权限控制,VMM API为分布式训练提供了高效的内存协同方案,显著提升大模型训练性能。

weixin_29251337的博客 535

利用VisualStudio进行Debug和Release版本的控制

项目-右键-属性-配置属性: C/C++ --常规-附加包含目录,附加包含目录中包含所需要的其他头文件,在最后加上 C/C++ -代码生成-运行库,Debug选择MDd或者MTd,根据静态编译还是动态编译来确定,Release模式则选择MD或者MT。 链接器 -常规-附加库目录,选择lib文件,lib文件下应该有debug与release两个分支,并且在最后加上。 链接器 -输入 -附加依赖项,把需要用到的lib文件填写进去,在最后加上。VS项目需要用到的依赖应该用相对路径,把需要用到的库以及头文件等文件包

alodonoa的博客 2109

【算法实战】Keystone变换:从原理到MATLAB实现的距离走动校正

本文深入解析Keystone变换在雷达信号处理中的距离走动校正应用,从原理到MATLAB实现全面讲解。通过三种实现方法(DFT+IFFT、Sinc插值、Chirp-Z变换)的对比分析,结合实战案例展示如何有效解决高速目标导致的距离单元跨越问题,提升多普勒频谱聚焦质量。

weixin_29055699的博客 295

VS静态编译设置

首先必须搞清楚项目->项目属性->配置属性->C/C++->代码生成->运行库中四个选项的关系: 多线程调试Dll (/MDd) 对应——-MD_DynamicDebug 多线程Dll (/MD) 对应————-MD_DynamicRelease 多线程(/MT) 对应—————–MD_StaticRelease 多线程(/MTd)对应—————-MD_Sta...

EmbeddedCoder 的优快云博客 9434

基于四旋翼模型的火箭型无人机视线角保持控制仿真设计

本文针对火箭型无人机的视线角保持控制问题展开研究。基于四旋翼动力学模型,通过改造设计了一种摄像头朝上安装的特殊无人机系统,用于追踪空中目标。文章详细推导了坐标系定义、运动学和动力学方程,重点分析了摄像头安装与视线几何关系,建立了目标运动模型和视线向量计算方法。通过解算期望姿态角,实现了使机体Z轴始终对准目标的控制目标。仿真结果表明,该系统能有效完成视线角保持任务,为空对空监视等应用场景提供了可行方案。~~~~~

huanghm88的专栏 143

AgentScope 2.0 扩展开发完全指南:从中间件到模型适配器的深度实践

本文系统讲解 AgentScope 2.0 框架的五大扩展机制,涵盖中间件系统的洋葱模型与钩子设计、ChatModelBase 基类与多供应商适配器开发、工作空间(本地/Docker/E2B)的抽象接口与生命周期管理、凭据工厂与 MCP 协议集成、以及工具协议与存储后端扩展。文中提供完整的架构图、代码示例与故障排查指南,帮助开发者快速掌握 AgentScope 的插件化扩展体系。

program哲学 298

在Visual Studio中,确定第三方库或自己工程应该设置的CRT库选项的工具

前言 将glog编译了好多版本,用测试程序连接时,各种错。 看了一下,主要是要链接的glog库的crt库设置和测试工程的crt库设置不配套引起的问题。 做了一个工具,来解决库链接不匹配的问题。做了测试,非常好用。 如果由于crt库设置不配套引起的编译错误,直接看编译时打出的提示,选择正确的第三方库或修改自己工程的crt设置。 实验 // @file main.cpp /...

博客标题不能为空 799

YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 5499

C/C++ Debug与Release混用:内存炸弹的成因与系统解决方案

在C/C++开发中,内存管理是程序稳定性的基石,其核心依赖于C运行时库(CRT)对堆内存的分配与释放。不同编译模式(如Debug与Release)链接了不同实现的CRT,导致内存管理器在调试填充、边界检查等方面存在根本差异。这种不一致性会破坏堆的内部数据结构,引发难以追踪的“堆损坏”问题,其技术价值在于揭示了模块化开发中二进制接口兼容性的深层挑战。在实际应用场景中,当主程序与第三方库或不同项目模块采用混合编译模式时,极易触发此类隐蔽崩溃。本文聚焦于**编译模式不一致**这一经典陷阱,通过剖析**CRT库分裂

weixin_33858485的博客 341

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

PCL 1.8.1 x86/64 + VS2017 配置各种问题的解决方法小结

在 Visual Studio 2017 中使用 pcl1.8.1 以及相关第三方库如 Boost 库的时候问题小结。

此木子 5034

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

vs2013+opencv2410的一些问题

1.设置microsoft.user时,debug和relaese只能修改一次,相对应的32和64会相应修改,因此可以新建一个属性表,命名为OpenCV2410debug; 2.报错:error LNK2019: 无法解析的外部符号 _gzputs debug模式下需要在添加动态链接库时,添加: libpngd.liblibtiffd.libzlibd.libIlmImfd.liblibja...

weixin_34174132的博客 172

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OpenCV2411+VS2013的配置(问题总结)

OpenCV各个版本在VS2013下的配置在网上有很多人进行了详细的介绍,在此不作赘述,主要是配置环境变量,添加各种依赖库的问题。 但是如果照着文档一步一步走便能轻松大功告成的话,程序员们可能做梦都会笑醒。所以说bug是无处不在的,我们的目标就是消除一切bug! Q1:error LNK2019: 无法解析的外部符号 _gzputs,该符号在函数 "void __cdecl icvPuts(s

三多学长的博客 831

解决Windows C++程序msvcp140d.dll缺失:从原理到部署的完整指南

动态链接库(DLL)是Windows系统中实现代码共享和模块化的重要机制,它允许程序在运行时调用共享库中的函数,从而减小可执行文件体积并便于统一更新。在C++开发中,程序运行依赖于微软Visual C++运行时库,该库提供了C++标准库和C语言运行时函数的基础支持。理解运行时库的调试版与发布版区别,对于确保程序在不同环境下的可移植性和部署可靠性至关重要。本文聚焦于开发中常见的msvcp140d.dll和ucrtbased.dll缺失问题,深入解析其作为调试版依赖库的特性与分发限制,并提供从项目配置、构建模式

weixin_30732487的博客 392
上一篇: Matlab资料汇总暨MATLAB中文论坛帖子整理(三)
下一篇: 如何在nginx服务器上实现多媒体流的录制和转码
zhanghui_cuc
博客等级 码龄14年 2993粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhanghui_cuc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值