一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD

Visual Studio C++中MT、MTd、MD、MDd都是什么 ⚠️ 注意:不同 Visual Studio 版本的运行时库名称可能不同(如 VS2019 为。: 增大二进制文件体积,且不同模块(如多个 DLL)各自包含运行时库副本,可能导致内存浪费。:适合依赖系统运行时库、减少体积的场景,但需确保目标环境有 VC++ Redist。是控制程序如何链接 C/C++ 标准库和运行时库的关键选项。确保项目内所有模块的运行时库选项一致,是避免内存问题和崩溃的关键!:适合需要独立分发、避免依赖的场景,但增大体积。(静态库、动态库)使用相同的运行时库选项。 阅读详情

引子

在做vs开发的时候,一定会遇到一个问题,将在你自己电脑上编译的程序,拿到其他电脑上运行,经常会产生无法运行的情况,特别是你将你的程序拷贝到xp系统上时,这是为什么呢?
一般遇到这个问题,大家第一步可能就是上网搜索,希望可以看到这篇帖子。

这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?

什么是Runtime Library?

Runtime Library就是运行时库,也简称CRT(C Run Time Library)。是程序在运行时所需要的库文件,通常运行时库是以Lib或Dll形式提供的。
Windows下C Runtime Library是微软对C标准库函数的实现,这样每个程序可以直接使用C标准库的函数;后来出现了C++,于是又在C Runtime Library基础上开发了C++ Runtime Library,实现了对C++标准库的支持。
在C Runtime Library出现之前,许多程序都使用C编写,而这些程序都要使用标准的C库,按照以前的方式每一个程序最终都要拷贝一份标准库的实现到程序中,这样同一时刻内存中可能有许多份标准库的代码(一个程序一份),所以微软出于效率的考虑把标准C库做为动态链接来实现,这样多个程序使用C标准库时内存中就只有一份拷贝了。
确切地说运行时库指的就是对这些底层的基础功能实现的动态库(Dll),运行时库和普通的Dll一样,只有程序用到了它才会被加载,没有程序使用的时候不会驻留内存的。话虽如此,但有多少系统的东西说不定也是用C写的,这些东西的存在就使C运行时库存在于内存中了,所以运行时库几乎总是需要的。虽然说运行时库应该是动态库,但习惯上我们把与动态运行时库相同代码编译出来的静态库也称为运行时库,因此VC++下的运行时库有MT、MTd、MD、MD。
在这里插入图片描述

Runtime Library和运行库 MT MTD MD MDD的关系

这是msdn上面的解释:

MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库
MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库
MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dll MDd:
MT+DLL+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll

开发多线程程序时,需要选择MT、MTd、MD、MDd其中的一个。

  • 对于MT/MTd,由于连接运行时库是LIBCMT.lib/LIBCMTD.lib,这两个库是静态库,所以此种方式编译的程序,移到另一台机器上面也可以正常运行;所以这种方式,不会产生缺少动态库的报错。
  • 但是对于MD/MDd,连接的是动态库,所以如果另一台机器上没有MSVCRT.dll/MSVCRTD.dll时,就提示缺少动态库这样的错误。

注意!!!
曾经犯这样的错误,以为以MT/MTd方式编译,程序对所有的库都是静态链接的,其实错了,它只能决定运行时库是动态链接还是静态链接,对用户自己写的库或其他第三方库,其连接方式取决于代码(显示连接动态库Loadlibrary)或所提供的lib文件(为导入库还是静态库),移动程序到别的机器上时,还是要带上所需要的动态库的。
多线程的动态运行时库是|msvcrt.lib+msvcrtxx.dll,之所以是msvcrtxx.dll是因为每一个版本的VS使用的库名称还不一样。而且还不止包含一个库,除了主要的MSVCRT库外,还有MSVCPRT、MSVCIRT库。它们之间的对应关系如下:
在这里插入图片描述
在你的VS安装目录下(如C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT),及系统目录C:\Windows\System32、C:\Windows\SysWOW64下都能找到对应的.dll库。

很多的软件在发布自己的产品时也都会带上这些DLL(防止用户的操作系统没有安装VS,或在系统目录下找不到对应的DLL)。

静态链接的多线程库

静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Address specified to RtlValidateHeap”问题。

动态链接的运行时库

动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中, MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态。
链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接,在运行时要求安装了相应版本的VC运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因/MD和/MDd方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以MD方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。

MDD、MTD和MD、MT

/MDd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ) ,与 /MD 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。

开发时注意事项

1.在多工程开发时,所有的工程使用同一种运行时库。

在多工程开发时,所有的工程使用同一种运行时库。如Utils的Solution下有两个Project:Utils和UsingUtils,UsingUtils工程要使用Utils工程编译出来的库。如果Utils使用了/MDd的方式,UsingUtils也要使用/MDd的方式,否则会报链接错误。
如果Utils使用MTd的方式,而UsingUtils使用/MDd的方式,则会出现重定义的错误,如:

1>LIBCMTD.lib(setlocal.obj) : error LNK2005: __configthreadlocale already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __free_dbg already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount already defined in MSVCRTD.lib(MSVCR100D.dll)

这是因为Utils使用MTd的方式,包含了libcmtd.lib库;而UsingUtils使用/MDd的方式,要包含msvcrtd.lib+msvcrtxxd.dll。libcmtd.lib和msvcrtd.lib是用相同代码编译的,一个是静态库,一个动态库的导入库,同时包含libcmtd.lib和msvcrtd.lib肯定就对相同的函数进行了重复的定义。

以Release方式进行编译时使用Release的库,使用Debug的方式编译时使用Debug的库。如编译Release版本的UsingUtils时,要使用Release方式编译出来的Utils库,编译Debug版本的UsingUtils时,要使用Debug方式编译出来的库。

2.建议使用MD、MDD

/MT、/MTd解决了多线程的问题,但随着程序的越来越复杂,一个程序可能会用到多个其他程序的库,多个程序可能会用到相同的库,在内存中会保存多份的相同的静态库。假设A程序使用了C.lib,B程序也使用了C.lib,A、B程序同时运行时,在内存中就会同时存在两份C.lib。
在这里插入图片描述(图源:luoweifu是一个文章写的很棒的大佬,推荐!! https://sunlogging.blog.youkuaiyun.com/article/details/49055933)

为了解决这个问题,就产生了动态库的技术。于是就有了动态的运行时库Multi-threaded DLL(/MD)、Multi-threaded DLL Debug(/MDd)。多个程序使用同一个动态库,在内存中只会有一份,效果图如下:
在这里插入图片描述

参考资料

《visual studio运行时库MT、MTd、MD、MDd的研究》https://blog.youkuaiyun.com/ybxuwei/article/details/9095067
《带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑》https://sunlogging.blog.youkuaiyun.com/article/details/49055933

靓仔有话说

vs是我接触的第一个也是用的最多的IDE,也被称为最强IDE,一般用在Windows开发上,之后靓仔将长期更新此系列,和大家一起学习使用visual studio!

Microsoft Visual Studio中的/MT, /MTd,/MD,/MDd分别是什么意思? Microsoft Visual C++ 编译器的运行时库链接选项决定了程序如何链接 C 运行时库(CRT)。具体含义如下:(多线程静态链接):(多线程静态链接调试版):(多线程动态链接):(多线程动态链接调试版):选择考虑因素:发布类型:通常 Release 版本用或,Debug 版本用或。部署需求:如果希望程序独立运行,选择;如果允许依赖系统 DLL,可选择。内存使用:可能在多个程序间共享内存,而每个程序都有自己的 CRT 副本。兼容性:使用第三方库时,需确保所有组件使用相同的运行时库选 阅读详情

相关推荐

MTd与MDd的区别

C++ 程序修改或移植过程中有时出现编译错误,比如“链接错误,****__crt__**** ”, 修改“项目 -> C/C++ ->代码生成 -> 运行库 :MTd 或MDd 就好了。  其中以小写“d”结尾的选项表示的DEBUG版本的,没有“d”的为RELEASE版本。大型项目中必须要求所有组件和第三方库的运行时库是统一的,否则将会出现LNK2005井喷。 VS 多线程...

andylanzhiyong的博客 7015

Microsoft Visual C++ Runtime Library Runtime Error的解决办法

打开浏览器时,出现Microsoft Visual C++ Runtime Library Runtime Error错误,初步估计是软件冲突,可能有多种出错的方式,我的是浏览器自动关闭。 一、 有些时候,在你安装、运行某个软件,可能会得到这样一个错误提示:   Microsoft Visual C++ Runtime Library   Runtime Error!   Program:c:/w...

m0_54409538的博客 9万+

Visual Studio中/MT、/MTd、/MD、/MDd的实战选择指南:从原理到部署

本文深入解析Visual Studio中/MT、/MTd、/MD、/MDd运行时库选项的核心差异与应用场景,提供从开发调试到部署的实战指南。通过对比静态链接与动态链接的优缺点,帮助开发者根据项目需求做出明智选择,避免常见的兼容性问题与性能陷阱。

weixin_27734811的博客 434

带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑

Windows下**C Runtime Library**是微软对C标准库函数的实现,这样每个程序可以直接使用C标准库的函数;后来出现了C++,于是又在C Runtime Library基础上开发了**C++ Runtime Library**,实现了对C++标准库的支持。因此现在Windows下的C/C++运行时库既包含子C标准库,也包含了C++标准库。如果你安装了VS2010,在安装目录下的VC\crt\src下

阳光日志 5万+

Visual Studio 中的 MD、MTD、MDD、MT 选项详解

选项描述主要用途/MD动态链接到多线程运行时库生产环境,需考虑部署/MT静态链接到多线程运行时库独立部署,无需额外安装/MDd动态链接到调试版多线程运行时库开发调试,丰富调试信息/MTd静态链接到调试版多线程运行时库开发调试,避免外部依赖。

h a 6 6 6 c k 为 你解决复杂难题! 1152

vs2010运行库

vs2010运行库,用vs2010开发的程序,在没有相应开发环境下运行时,可以添加安装此支持库,减少错误原因,在安装MySQL ODBC驱动时,如果安装失败,可以先添加此支持库,再进行安装话,就能成功安装。

visual studio运行时库MT、MTd、MD、MDd的研究

在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?这是msdn上面的解释: MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库 MTd:mutithread+debug,多

ybxuwei的专栏 1万+

vs2010 VCRuntimes

vs2010 VCRuntimes 运行库,解决gdal_cshap库,部署异常问题。该插件主要解决在没有安装VS2010环境电脑中运行gdal_cshap.dll时异常问题。

visual studio运行时库MT、MTd、MD、MDd

在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装相应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?这是msdn上面的解释: MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库 MTd:mutithread+debug,多...

积累点滴,保持自我 941

VC2010sp1运行库(Visual C++ 2010)简体中文版

Microsoft Visual C++ 2010Redistributable Package (x86) 安装 Visual C++ 库的运行时组件,使用户能够在未安装 Visual C++ 2010 的计算机上运行使用 Visual C++ 开发的应用程序

从2D到3D地图开发:手把手教你用Cesium+Three.js实现卫星轨迹可视化(含代码片段)

本文详细介绍了如何结合Cesium与Three.js实现从2D到3D的卫星轨迹可视化。通过对比传统Web GIS框架的局限,阐述了Cesium处理三维地理与轨道数据、Three.js负责高级图形渲染的分工优势,并提供了从环境搭建、坐标同步到动态粒子效果实现的完整代码实战指南。

nut55的博客 672

visual studio运行时库MT、MTd、MD、MDd的研究(转载)

转载:http://blog.youkuaiyun.com/ybxuwei/article/details/9095067 转载:http://blog.sina.com.cn/s/blog_624485f70100rp2l.html 转载:https://blog.youkuaiyun.com/jigetage/article/details/80619386 1. 在开发window程序是经常会遇到编译好好的...

weixin_34289454的博客 221

uniapp实现app版本发现新版本后,自动更新

app实现自动更新

oldolder的博客 1284

visual studio运行时库MT、MTd、MD、MDd的区别

    在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装相应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢? 因为编译链接时候加上如下标志,会链接上运行时库,语法如下 /MD[d] /MT[d] /LD[d] 这些标志代表的含义如下: MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库LIBCMT.lib,放入.obj file中,链接器会用LIBCMT.lib 来.

子燕若水的博客 1247

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 81

Visual Studio 中的 /MD 与 /MT、动态库与静态库的深入解析

MD 与 /MT/MD 动态链接 CRT,生成的文件体积较小,但存在对外部运行时库的依赖,需要目标系统安装相应的运行时库。/MT 静态链接 CRT,生成的文件独立运行,无需额外的运行时库依赖,但文件体积较大。动态库与静态库静态库将代码嵌入到可执行文件中,具有很强的独立性,适合自包含的程序,但更新库时需要重新编译程序。动态库在运行时加载,多个程序可以共享,文件体积小,便于更新,但存在对外部 DLL 文件的依赖,可能会出现版本冲突问题。实践建议。

码事漫谈 2247

HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真

LVTTL电平为单端信号,而SSTL电平本质上是差分对,其实现机制是将信号与参考电平Vref组成差分对进行比较,如图所示,VIH和VIL各有一个交流参数AC和直流参数DC,信号第一次越过AC门限的时刻,作为时序计算的参考点,此后只要信号保持DC门限内,逻辑状态保持不变,这种设计减小了噪声、振铃等对于信号质量的影响。经过调整后,控制器在发送颗粒1的DQS后,延时1ns再发送颗粒2的DQS,则颗粒1在1ns后收到对齐的DQS和CLK,颗粒2在2ns后收到对齐的DQS和CLK,从而满足了时序关系。

小幽余生不加糖 7679

VC 运行时库 /MD、/MDd 和 /MT、/MTd(转)

这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了。 首先说/MT /MT是 "multithread, static version ” 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。 /MD是 "multithread- and DLL-specific version” ,意思是多线程DLL版本,定义了它后,编译器把 MSVCRT.lib 安置到OBJ文件中,它.

dragoo1的专栏 1402

全网最详细的 Ubuntu 18.04 安装Livox mid-360驱动,测试 fast_lio2

Livox mid-360需要使用Livox-SDK2,而非Livox-SDK,以及对应的。并需要修改FAST_LIO中部分代码。Faster—LIO;Faster-LIO:快速激光IMU里程计。Faster-LIO:快速激光IMU里程计PDF。大部分Lidar SLAM都是基于loam进行改造的,基本上是通过线特征edge和面特征(面点)分割进行配准得到里程计的,而fast-lio2是通过一个迭代扩展卡尔曼滤波器去优化帧内位姿,然后通过输入点云与地图进行配准得到里程计,精度和鲁棒性都不错。

努力努力努力 6239

学Simulink--决策规划场景实例:基于Simulink的智能车辆行为决策仿真

本文基于Simulink平台构建智能车辆变道决策仿真系统,采用MOBIL算法实现"决策-规划-执行"全流程。系统包含自车动力学模型、环境感知模块(含5%噪声)、决策控制器和轨迹规划模块,通过五次多项式实现平滑变道。仿真验证了三种典型工况:正常变道(成功率100%)、邻车拒绝让行和紧急避障,各项指标均满足要求(TTC>3s,横向加速度<2m/s²,决策周期<100ms)。文章详细介绍了建模步骤、核心算法实现和参数配置方法,并提出了强化学习、多车协同等优化方向。该模型为智能

amy_mhd的博客 153

Visual Studio 编译错误 LNK2038:MTD 和 MDD 的区别及解决方法

LNK2038错误通常是由于运行时库配置不匹配引起的。通过检查项目设置,统一运行时库配置,修改第三方库的配置,使用预处理器指令等方法,可以有效解决这个问题。希望本文能够帮助你更好地理解和解决LNK2038错误,提高项目的编译和运行效率。

小庞的博客 1502

Pytorch实现之SRGAN+CBAM的结构设计

在SRGAN的残差连接中加入了CBAM注意力机制,同时设计了四类损失来训练。

LJ1147517021的博客 572

CMake编译参数冲突?手把手教你解决‘/MTd‘被‘/MDd‘覆盖的问题

本文深入解析了CMake编译过程中常见的'/MTd'被'/MDd'覆盖的警告问题。文章详细阐述了两种运行时库链接模型的区别,提供了诊断参数冲突的实用方法,并给出了直接替换、智能过滤与拼接以及使用预设文件等多种根治方案,帮助开发者彻底解决CMake编译参数冲突,确保构建的健壮性。

iii12的专栏 646

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Visual Studio 2022 CRT 配置实战:/MT、/MD、/MTd、/MDd 4 种模式选择与陷阱

本文深入解析Visual Studio 2022中CRT(C运行时库)的四种配置模式(/MT、/MD、/MTd、/MDd),详细对比其特点与适用场景,并提供实战配置指南和常见问题解决方案,帮助开发者避免链接错误和运行时陷阱,确保项目稳定运行。

319

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

vc++编译时运行库选择(/MT、/MTd、/MD、/MDd)

在vs中,项目属性 -》C/C++ -》代码生成 -》运行库 选项内有四个选项:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)。这个设置代表什么意思?四个选项又是什么意思,有什么区别?接下来详细讨论。 先奉上一个写得非常详细的博客链接:你所不知道的C和C++运行库,这个文章中写得非常详细,本文也主要参考了这篇文章。 还有这篇C Runtime Li

David 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: C++11新特性学习:auto类型推导
下一篇: 现代C++实践100练:为什么使用nullptr代替NULL?因为它更加风骚
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值