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

2023-11-08

2013-01-24 18:42  11058人阅读  评论(2)  收藏  举报
  分类:

有段时间在写cuda程序是出现过

error LNK2005: _exit 已经在 MSVCRTD.lib(MSVCR71D.dll) 中定义 等类似错误

原因应该是在vs2010 工程属性中 c/c++的代码生成(code generation)中的设置与cuda c/c++ Host Runtime library不一样导致的。
后来在写opencv程序中的 findcontour()函数时,又是碰到 多线程调试 (/MTD) 和 多线程调试dll(/MDd)等问题,所以特此查了些内容。


1、 http://qimo601.iteye.com/blog/1550348

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

首先说/MT

/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)

 

Reusable Library 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 Address specified 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在非必要时最好也不要采用了。



2、 http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.html

C编译选项 多线程(/MT)
多线程调试(/MTd)
多线程 DLL (/MD)
多线程调试 DLL (/MDd)
C 运行时库                        库文件
Single thread(static link) ML            libc.lib
Debug single thread(static link) MLd        libcd.lib
MultiThread(static link) MT            libcmt.lib
Debug multiThread(static link) MTd            libcmtd.lib
MultiThread(dynamic link) MD            msvert.lib
Debug multiThread(dynamic link) MDd        msvertd.lib 
3. 各种 C 运行时库的区别
( 1 )静态链接的单线程库
静态链接的单线程库只能用于单线程的应用程序, C 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线
程库。
( 2 )静态链接的多线程库
静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
( 3 )动态链接的运行时库
动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中, MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态
链接的运行时库。
/MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ) ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息
,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。 
下面是msdn关于Visual C++ 编译器选项的说明:
这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。
选项     说明
/MD     定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链
接的应用程序可用。
当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接
,同时仍通过 msvcrt.lib 动态链接到主 CRT。
/MDd     定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
/ML     使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。
/MLd     定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。
/MT     定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析
外部符号。创建多线程程序需要 /MT     或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
/MTd     定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使
用 LIBCMTD.lib 解析外部符号。创    建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
/LD     创建 DLL。
将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
链接 DLL 启动代码。
如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。
如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。
/LDd     创建调试 DLL。定义 _DEBUG。
    警告   不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内
部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非 
DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。



3、 http://hi.baidu.com/musvision/item/80343d94ef7af3ecb725319a


IBCMTD.lib(crt0dat.obj) : error LNK2005: _exit 已经在 MSVCRTD.lib(MSVCR71D.dll) 中定义 等类似错误 
原因: 
Run-Time Library 
?Run-Time Library是编译器提供的标准库,提供一些基本的库函数和系统调用。 
我们一般使用的Run-Time Library是C Run-Time Libraries。当然也有Standard C++ libraries。 
C Run-Time Libraries实现ANSI C的标准库。VC安装目录的CRT目录有C Run-Time库的大部分源代码。 C Run-Time Libraries有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。
?动态链接库版本: 
/MD Multithreaded DLL 使用导入库MSVCRT.LIB
/MDd Debug Multithreaded DLL 使用导入库MSVCRTD.LIB 
?静态库版本: 
/ML Single-Threaded 使用静态库LIBC.LIB
/MLd Debug Single-Threaded 使用静态库LIBCD.LIB
/MT Multithreaded 使用静态库LIBCMT.LIB
/MTd Debug Multithreaded 使用静态库LIBCMTD.LIB 
若要使用此运行时库  请忽略这些库  
单线程 (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  
调试单线程 (libcd.lib)  libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib  
调试多线程 (libcmtd.lib)  libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib  
使用 DLL 的调试多线程 (msvcrtd.lib)  libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib 

解决方法: 
属性,链接器,输入,忽略指定库 libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib (使用一个,忽略其他的。还可以尝试其他编译选象)

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

VC 运行时库 /MD、/MDd 和 /MT、/MTd 的相关文章

  • Ubuntu运行rviz报错:OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext

    写在前面 笔者的测试环境 xff1a Ubuntu20 04 xff0c ROS noteic 一 问题描述 运行rviz时出现报错 xff1a span class token punctuation span WARN span cla
  • Ubuntu运行rviz报错:OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext

    写在前面 笔者的测试环境 xff1a Ubuntu20 04 xff0c ROS noteic 一 问题描述 运行rviz时出现报错 xff1a span class token punctuation span WARN span cla
  • Ogre-渐变背景色(gradient background)的实现

    转载自 xff1a http blog csdn net hefee article details 6287341 背景色在ogre里面是通过ViewPort类中的setBackgroundColour xff08 xff09 这个成员函
  • Ogre 界面(Overlay)

    Ogre 界面 Overlay 标签 border脚本buttontemplatesplugins引擎 2011 10 16 23 12 4725人阅读 评论 2 收藏 举报 分类 引擎技术 9 这里的界面是指菜单 HUD及提示信息框在内的
  • 可编程渲染管线与着色器语言

    可编程渲染管线与着色器语言 Programming pipeline shading language Sampler Direct3D 9 asm ps A sampler is a input pseudo register for a
  • [OGRE]基础教程来四发:来谈一谈地形系统

    OGRE 基础教程来四发 来谈一谈地形系统 标签 OGRE 2013 10 09 17 22 2238人阅读 评论 1 收藏 举报 分类 OGRE 11 版权声明 本文为博主原创文章 未经博主允许不得转载 英文链接如下 http www o
  • 如果XML文件太大(10M),打开方式选择

    用UltraEdit打开 其他的例如Editplus和notepad 根本打不开上百M的文件 一打开就死了
  • ogre 1.7.0

    今天编译了orge 第一次安装编译orge挺麻烦的 现把编译和安装步骤总结一下 1 ogre 1 7 0的下载地址 https sourceforge net projects ogre files ogre 1 7 ogre v1 7 0
  • ogre引擎0.12.0抄写记录

    惊喜地发现 文档齐全 可以参考类图抄 C Users Legion Desktop ogre v0 12 0 ogrenew Docs api html hierarchy html 先进行 1 OgreMain 然后 2 RenderSy
  • Ogre学习记录

    Ogre学习记录 Posted on 2008 07 09 15 36 RichardHe 阅读 839 评论 2 编辑 收藏 引用 所属分类 OGRE 1 设计初衷 它设计初衷是完全跨平台的 抽象的接口隐藏了平台相关的细节 它设计初衷是大
  • 地形平滑算法

    地形平滑算法 2013 06 20 18 33 2486人阅读 评论 0 收藏 举报 分类 OGRE 41 C C 10 版权声明 本文为博主原创文章 未经博主允许不得转载 拉出来的地下不平滑怎么办 笨办法就是美工一个顶点一个顶点的调整 而
  • Axiom3D:Ogre地形代码解析

    Axiom3D Ogre地形代码解析 作者 天天不在 发布日期 2014 09 01 20 52 05 我来说两句 0 Tag标签 地形 代码 大致流程 这里简单介绍下 Axiom中采用的Ogre的地形组件的一些概念与如何生成地形 先说下大
  • VC 运行时库 /MD、/MDd 和 /MT、/MTd

    VC 运行时库 MD MDd 和 MT MTd 2013 01 24 18 42 11058人阅读 评论 2 收藏 举报 分类 C C 19 有段时间在写cuda程序是出现过 error LNK2005 exit 已经在 MSVCRTD l
  • hlsl register

    https msdn microsoft com en us library dd607359 v VS 85 aspx register Optional keyword for assigning a shader variable t
  • 理解D3D—(2)最多混合几层texture

    理解D3D 2 最多混合几层texture 先提出问题 Q 要是模型有很多层贴图 再加上shadow map 还有ssao 岂不是会不够用了 A 参考资料 IDirect3DDevice9 SetTexture Assigns a text
  • DirectD3D-纹理映射

    DirectD3D 纹理映射 标签 Direct3Ddirectx游戏游戏开发 2014 11 12 14 03 321人阅读 评论 0 收藏 举报 分类 DirectX 8 版权声明 本文为博主原创文章 未经博主允许不得转载 纹理映射的概
  • OGRE动画

    动画是由若干静态画面 快速交替显示而成 因人的眼睛会产生视角暂留 对上一个画面的感知还末消失 下一张画面又出现 就会有动的感觉 计算机图形学中的动画也同样遵循着这一本质的原理 只不过不同于传统动画的手绘和拍摄 Ogre图形引擎可以通过自动或
  • 关于 Demo_Ocean 例子的分析

    关于 Demo Ocean 例子的分析 重要总结 1 该例主要类不再继承自ExampleApplication和ExampleFrameListener 重写驱动类和监听类 2 如何创建OIS的输入系统 1 创建OIS ParamList
  • 第十三章 公告板与粒子系统 标签: ogre公告板粒子系统ogre粒子系统

    Ogre编程入门与进阶 第十三章 公告板与粒子系统 标签 ogre公告板粒子系统ogre粒子系统 2015 07 05 14 41 1365人阅读 评论 1 收藏 举报 分类 Orge模块 16 版权声明 本文为博主原创文章 未经博主允许不
  • Ogre g++ 编译时错误

    在ubuntu上 我已经编译并安装了所有的ogre库 但是 当我尝试使用此命令编译教程时 g o otest ogre cpp I pkg config libs cflags OGRE OIS lOgreMain lOI 它输出 tmp

随机推荐

  • VMware NSX 4.0安装、配置和升级实战

    本文通过一个Vmware NSX 4的安装配置实例 扼要说明了一个典型的NSX系统配置 升级过程需要注意的正确步骤 并列出了作者在学习过程中踩过的坑 为同行绕过提供借鉴 1 系统软硬件环境说明 本安装实例 使用了3台Dell PowerEd
  • 【k8s基础篇】k8s scheme1 之内外部版本

    参考 K8s源码分析 3 Resource Version 内外部版本 1 简介 众所周知 在 kubernetes 中所有的 resource 都是基于 group 分组的 例如 apps group 中定义了我们熟悉并常用的 deplo
  • 综合实验(续)

    AdvancedInheritance 描述 不同的动物既有共性也有个性 鸟类会飞 鱼会游泳 请设计类的层次结构进行表示 并通过以下测试 int main Animal animal string type color bool Ostei
  • PuTTY 中文教程 作者:柴锋 2006年11月

    http chaifeng com blog 2007 06 putty 200611 html
  • Regionserver频繁挂掉故障处理实践

    近期腾讯云的一家大客户频繁出现HBase regionserver 挂掉 影响业务正常使用 通过调整堆栈大小 gc优化 超时时间等都无法解决该问题 经过细致并综合分析hbase regionserver hbase master以及 zoo
  • vue项目打包和部署?

    vue项目打包和部署 1 执行打包命令 npm run build 打包过程 看到上图则代表已打包完成 此时项目中会生成dist目录 dist目录中有static目录和index html 2 打包完成后 此时直接用浏览器打开index h
  • 每日一题:Alice的德州扑克

    Alice的德州扑克 题目 Daimayuan Online Judge 从最大的牌开始判断 如果满足直接输出 return 0 否则就接着判断 一层一层往下判断 AC代码 include
  • win10添加环境变量后没用_今天告诉你Win10系统配置环境变量未生效的完全解决教程...

    有网友用win10系统的时候遇到过Win10系统配置环境变量未生效的问题 不知道大家是不是也遇到过 想必我们大家以后也可能会遇到Win10系统配置环境变量未生效的情况 那能不能解决呢 肯定时可以解决Win10系统配置环境变量未生效的问题 小
  • DDOS攻击

    一 DOS VS DDOS Dos是拒绝服务攻击 而DDOS Distribution Denial of service 是分布式拒绝服务攻击 Dos与DDOS都是攻击目标服务器 网络服务的一种手段 区别 DOS是利用自己的计算机攻击目标
  • 华为android9手机短信不提醒设置,华为手机微信不提醒怎么办 华为收不到微信提示信息多种解决方法...

    到底是哪里出了问题呢 捣鼓了半天 宝宝终于发现了 原来微信收不到消息竟是因为设置有误 有同遭遇的亲们看这里吧 快快get新技能吧 华为收不到微信提示信息多种解决方法 请确认以下事项 确认已开启通知功能 a 开启微信应用内部的通知功能 我 g
  • Spring——动态代理

    动态代理 理解 基于反射机制 掌握程度 1 什么是动态代理 使用jdk的反射机制 创建对象的能力 创建的是代理类的对象 而不用你创建类文件 不用谢java文件 动态 在程序执行时 调用JDK提供的方法才能创建代理类的对象 jdk动态代理 必
  • 如果你是以下几类VR程序员,别浪费青春在 Vulkan 上了

    如果你是以下几类VR程序员 别浪费青春在 Vulkan 上了 编码之妙 2016 08 28 09 01 如果你属于以下几类人 那么别浪费时间在 Vulkan 上了 国内名牌大学的大学生 Vulkan 性价比极低 比精通 C 的性价比还低
  • 区块链加密算法简述

    1 简述 加密简单而言就是通过一种算法将明文信息转换成密文信息 信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程 根据加解密的密钥是否相同 算法可以分为对称加密 非对称加密和对称加密和非对称加密的结合 2 对称加密 对称加密顾
  • 2.9-2.12段寄存器和cs:ip

    段寄存器有四类 cs ds ss es 其中 cs是代码寄存器 它指向的代码段是一组地址连续 起始地址为16的倍数的内存单元 这个代码段可以存储长度为N N lt 64KB 的一组代码 而与之相关联的是IP 指令指针寄存器 步骤如下 1 c
  • 如何使用postman做接口测试

    常用的接口测试工具主要有以下几种 Postman 简单方便的接口调试工具 便于分享和协作 具有接口调试 接口集管理 环境配置 参数化 断言 批量执行 录制接口 Mock Server 接口文档 接口监控等功能 JMeter 开源接口测试及压
  • Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED参数详解

    Intent FLAG ACTIVITY RESET TASK IF NEEDED 参数详解 If set and this activity is either being started in a new task or bringin
  • C# 读一个文件转成json

  • java interface的定义变量_【Java关键字-Interface】为什么Interface中的变量只能是 public static final...

    三个关键字在接口中的存在原因 public 接口可以被其他接口继承 也可以被类实现 类与接口 接口与接口可能会形成多层级关系 采用public可以满足变量的访问范围 static 如果变量不是static的 那么接口必须实例化才可以访问自己
  • uni.navigateBack 传值

    uniapp使用uni navigateBack向上一个页面传值的方式 在需要传值的页面写 wx navigateBack 返回 delta 1 uni emit handClick 传递的参数名 传递的值 获取传过来的值在onShow里面
  • VC 运行时库 /MD、/MDd 和 /MT、/MTd

    VC 运行时库 MD MDd 和 MT MTd 2013 01 24 18 42 11058人阅读 评论 2 收藏 举报 分类 C C 19 有段时间在写cuda程序是出现过 error LNK2005 exit 已经在 MSVCRTD l