MT,MTd,MD,MDd详解解决 MSVCRTD.LIB和LIBCMTD.LIB冲突

2023-10-31

项目开发过程中遇到MSVCRTD.LIB和LIBCMTD.LIB的冲突,后来找到原因是代码编译时选择c/c++的运行库版本不一样。于是搞明白了MT,MTd,MD,MDd的区别,问题出现的根源算是明白了。(libc.lib找不到也可以在这里找到答案)

先用简单的方式概括一下原因:

项目-属性-c/c++-代码生成-运行库的选择

选择 MT会用到LIBCMT.LIB   MTD会用到LIBCMTD.LIB

选择 MD会用到MSVCRT.LIB   MDD会用到MSVCRTD.LIB

如果你使用的库用的MT,你自己的程序为MD,则会发生MSVCRTD.LIB和LIBCMTD.LIB的冲突(debug)或者MSVCRT.LIB和LIBCMT.LIB的冲突(release)

解决方法可以保持库编译版本的一致,如果无法保证,就使用终极大招

项目-属性-链接器-命令行-附加参数加入   /FORCE:MULTIPLE

这个参数会自动忽略重复定义


 注意:项目-属性-配置属性-常规-MFC的使用,这一选项,

如果选择了在静态库中使用MFC,则代码生成时只能选择MT(Release)或者MTd(Debug)

如果选择了在共享的DLL中使用MFC则,代码生成时只能选择MD(Release)或者MDd(Debug)


这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了。

为了防止不同运行库导致的库冲突,需要就行忽略

   版 本 类 型 使用的library 被忽略的library
R  Release 单线程 libc.lib libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
多线程 libcmt.lib libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
使用DLL的多线程 msvcrt.lib libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
D   Debug 单线程 libcd.lib libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
多线程 libcmtd.lib libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
使用DLL的多线程 msvcrtd.lib libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

遇到libc.lib找不到是因为它是单线程用到的库,而单线程在VS2003以后就被微软取消了,所以老版本的用单线程编译的库就提示libc.lib找不到错误,

你可以在忽略特定库中忽略它,或者去vc6找一个包含进来,


下面进行详细讲解:

/MT是 "multithread, static version ” 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。

/MD是 "multithread- and DLL-specific version” ,意思是多线程DLL版本,定义了它后,编译器把

MSVCRT.lib 安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。

即:

静态运行时库:LIBCMT.lib
动态运行时库:MSVCRT.lib +MSVCR80.DLL

所以,当你用CMAKE生成工程文件时,若CMAKE是用/MT生成的(查看工程原始目录的CMakeLists.txt),则它所调用的运行时库为:LIBCMT.lib,若生成的工程的运行时库(Runtime Library)你选择/MD,则此工程在编译后链接的时候,将会调用动态运行时库:MSVCRT.lib +MSVCR80.DLL,明显,两次对同一个某运行时库里的函数调用的库不同,则会出现重定义的错误。若此工程生成的是库文件,则其他工程调用此库时也必须是/MT。

===============================================

VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)

 

ReusableLibrary Switch Library Macro(s) Defined

Single Threaded

/ML

LIBC

(none)

Static MultiThread

/MT

LIBCMT

_MT

Dynamic Link (DLL)

/MD

MSVCRT

_MT and _DLL

Debug Single Threaded

/MLd

LIBCD

_DEBUG

Debug Static MultiThread

/MTd

LIBCMTD

_DEBUG and _MT

Debug Dynamic Link (DLL)

/MDd

MSVCRTD

_DEBUG, _MT, and _DLL

 

 

   其中以小写“d”结尾的选项表示的DEBUG版本的,没有“d”的为RELEASE版本。大型项目中必须要求所有组件和第三方库的运行时库是统一的,否则将会出现LNK2005井喷。

   单线程运行时库选项/ML和/MLd在VS2003以后就被废了。

   /MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Addressspecified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。

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

   结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MT,MTd,MD,MDd详解解决 MSVCRTD.LIB和LIBCMTD.LIB冲突 的相关文章

随机推荐

  • 华为云服务器怎么传文件,在云服务器终端里面怎么传文件

    在云服务器终端里面怎么传文件 内容精选 换一换 已获取该弹性云服务器的密钥文件 弹性云服务器已经绑定弹性IP地址 已配置安全组入方向的访问规则 如果您是在Windows操作系统上登录Linux 可以按照下面方式登录弹性云服务器 我们以PuT
  • 数据结构——单调栈

    单调栈 定义 单调递增栈 单调递增栈就是从栈底到栈顶数据是从小到大 单调递减栈 单调递减栈就是从栈底到栈顶数据是从大到小 实现 以单调递增栈为例 向栈中推入元素时 如果栈顶元素比当前元素大 则将栈顶元素推出 直到栈顶元素比当前元素小或者栈为
  • IDEA新建项目时,没有Spring Initializr选项(亲测有效)

    最近开始使用IDEA作为开发工具 然后也是打算开始学习使用spring boot 看着博客来进行操作上手spring boot 很多都是说 创建一个新项目 Create New Project 选择 Spring Initializr 然而
  • 全网最全jupyter安装与使用教程

    jupyter的安装与使用 注 我主要使用的是windows系统 其余的也不太了解 不过这篇文章可以解决大部分问题 部分图片过大 建议打开网址 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序 简而言之 Jupyte
  • c++输出字符数组出现汉字乱码(包含用for循环输入字符数组再输出数组,出现汉字乱码)

    原因在于字符数组里存放内容没有字符结束标志 0 例子1 没有 0 include
  • c#翻页效果

    用c 和GDI 实现杂志翻页动画效果时间 2010 01 13 blog csdn net 周公 说明 以前本人参与个一个电子杂志项目 当时要求实现模拟现实生活中的杂志翻页动画效果 别人推荐了这篇文章 最后达到了我想要的效果 今天尝试把这篇
  • 漫谈-Weblogic-CVE-2020-2555

    背景 2020年1月 互联网上爆出了weblogic反序列化远程命令执行漏洞 CVE 2020 2555 Oracle Fusion中间件Oracle Coherence存在缺陷 攻击者可利用该漏洞再未授权情况下通过构造T3协议请求 获取w
  • 软件测试面试题:HTTP和HTTPS协议区别?

    HTTP和HTTPS协议区别 https协议需要到CA Certificate Authority 证书颁发机构 申请证书 一般免费证书较少 因而需要一定费用 http是超文本传输协议 信息是明文传输 Https协议是由SSL和Http协议
  • 6 种易于上手的编程副业,每月赚取 1,000 多美元——没有废话

    没有自由职业者或博客 也不需要前期费用 你们中的大多数人阅读这样的故事是希望其中的一些故事能帮助您赚更多的钱 好吧 几年前我还是同一个人 我希望尝试一些新的副业并赚点钱 其中一个视频建议我在网上写作 此后我写了很多技术文章 在此过程中 我开
  • react结合js获取屏幕鼠标滚动等距离实现页面懒加载

    懒加载 也叫延迟加载 指的是在长网页中延迟加载内容或图像 是一种很好优化网页性能的方式 在滚动屏幕之前 可视化区域之外的内容不会进行加载 在屏幕滚动距离底部到一定距离时才加载 这样网页的加载速度更快 减少了服务器的负载 懒加载适用于图片较多
  • Python学习笔记第十一天(迭代器与生成器)

    Python学习笔记第十一天 迭代器与生成器 迭代器 StopIteration 生成器 结束语 迭代器与生成器 迭代器 迭代是Python最强大的功能之一 是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的
  • linux启动service服务

    https medium com ameyadhamnaskar running java application as a service on centos 599609d0c641
  • Spark中的三种隐式转换

    1 使用SparkSQL中toDF时 import spark implicits 2 Spark整合Kudu 创建Kudu对象时 improt org apache kudu spark kudu 3 Spark中一些Scala类型转Ja
  • 每日一题:最长因子链

    最长因子链 题目 Daimayuan Online Judge 由于要找的数字不用按顺序 所以先给所有数排个序 找最长因子链类似于找最长上升子序列 用动态规划 状态划分 以第i个数结尾的因子链的倒数第二个数可能是第一个数 第二个数 第i 1
  • Settings sync 配置与使用

    1 settings sync 配置与使用 参考文章 我辈敢怀凌云志 参考文章 胖茄子 注意 settings sync 下载之后 一定要现在 忽略文件夹中 添加 History 忽略历史文件夹 1 获取令牌 步骤 点击 github 头像
  • 系统突然运行慢,线上CPU100%,频繁FullGC排查

    当然 这些问题最终导致的直观现象就是系统运行缓慢 并且有大量的报警 本文主要针对系统运行缓慢这一问题 提供该问题的排查思路 从而定位出问题的代码点 进而提供解决该问题的思路 对于线上系统突然产生的运行缓慢问题 如果该问题导致线上系统不可用
  • 实现QQ截图粘贴到聊天框功能

    QQ截图在网页聊天中不能直接粘贴 要实现像QQ微信一样能直接粘贴成图片需要做一些操作 利用paste事件捕获粘贴事件 clipboardData获取剪切板中的内容将文件用filereader接口读取出来 function paseImg v
  • Qt报Multiple definition错误的解决

    问题描述 今天在QT的开发环境下编写代码的时候发现这样的问题 如上图所示 经过自己千百次代码确认 代码是不存在任何问题 最后发现原来是自己添加文件的时候多添加了一次 导致在 pro文件下面有重复包含 发现 pro文件所示 有两个cluste
  • Basic Level 1041 考试座位号 (15分)

    题目 每个 PAT 考生在参加考试时都会被分配两个座位号 一个是试机座位 一个是考试座位 正常情况下 考生在入场时先得到试机座位号码 入座进入试机状态后 系统会显示该考生的考试座位号码 考试时考生需要换到考试座位就座 但有些考生迟到了 试机
  • MT,MTd,MD,MDd详解解决 MSVCRTD.LIB和LIBCMTD.LIB冲突

    项目开发过程中遇到MSVCRTD LIB和LIBCMTD LIB的冲突 后来找到原因是代码编译时选择c c 的运行库版本不一样 于是搞明白了MT MTd MD MDd的区别 问题出现的根源算是明白了 libc lib找不到也可以在这里找到答