MT: mutithread  Static,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库

MTd:mutithread debug Static ,多线程调试版,连接LIBMITD.lib库

MD:mutithread  +Dynamic,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dll

MDd: mutithread +Dynamic+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll

具体见:

选项

说明

/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 解析外部符号。

/LD

创建 DLL。

将 /DLL 选项传递到链接器。 链接器查找 DllMain 函数,但并不需要该函数。 如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。

链接 DLL 启动代码。

如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。

将 /Fe(命名 EXE 文件) 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。

除非显式指定 /MD,否则将暗指 /MT

/LDd

创建调试 DLL。 定义 _MT 和 _DEBUG

vs 工具上修改地方是:“项目 -> C/C++ ->代码生成 -> 运行库

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

2.多线程调试和多线程DLL调试的区别是动态链接还是静态链接C运行时库(C runtime Library, CRT)。

如果是动态链接(MD/MDd),你的程序就依赖C运行时的动态链接库(比如VS2010的msvr100.dll),当你的程序在其他没有这个dll的电脑上运行就会出现错误(找不到这个dll)。

如果是静态链接(MT/MTD),C运行库直接链接到你的程序里,你的程序就不依赖C运行时库的dll了。

微软是推荐是用动态链接的,因为这种链接方式可以减少可执行文件的大小、可以减少内存的使用、避免链接问题。

 /MT和/MTd

/MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份。(即会有多个堆,容易使释放内存出现问题)。

容易出现关于__acrt_first_block == header异常,根本的原因是对象在析构时不正确的释放内存导致的。见:c++:动态库接口函数返回stl对象的设计原则塈‘__acrt_first_block == header’异常原因分析_10km的专栏-CSDN博客

  /MD和/MDd

/MD和/MDd表示采用多线程CRT库的动态dll版本,会使应用程序使用运行时库特定版本的多线程DLL。链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接。当多项目以MD方式运作时,其内部会采用同一个堆。

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

这是个很典型的问题,在MSDN上也有描述。问题是这样的:

在一个DLL里面分配内存,然后在DLL的调用者EXE那里释放内存。

当DLL和EXE里面有一个是使用MT连接CRT的时候就有问题。如果DLL和EXE都使用MD,那么就没有问题。

解决办法:

1.exe和dll 都使用MDd运行库。

2.在dll中封装一个模板类,使模板类实现。

3.在dll中使用虚函数,目的就是是创建和删除都是使用同一个crt. 如果我们创建2个虚函数,一个用来分配内存,一个用来释放内存。在对象构造的时候,这个对象的虚表里面就已经指向了创建这个对象的模块里面的CRT的new和delete,那么当我们在DLL里面调用虚函数来释放的时候,系统会为我们找到构造对象时候的释放函数。这样就没有问题了。

见代码

class MyWrapperEx
{
public:
    explicit MyWrapperEx(int* p) : m_p(p)
    {}

virtual ~MyWrapperEx()
    {
        if (m_p)
        {
            delete m_p;
            m_p = nullptr;
        }
    }
    virtual void ChangeValue(int isize)
    {
        int* p = new int[isize];
        if (m_p)
        {
            delete m_p;
            m_p = p;
        }
    }
private:
    int* m_p;
};

void funcWrapperdll(MyWrapperEx& p)
{
    p.ChangeValue(2);
}

class MyWrapperEx;
int main()
{
    MyWrapperEx w2(new int);
    funcWrapperdll(w2);

}

vs的运行库 MT MTd MD MDd区别相关推荐

  1. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)

    vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...

  2. VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别

    VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别 VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) C ...

  3. CMake设置MSVC工程MT/MTd/MD/MDd

    文章目录 0. 前言 1. 如何设置 1.1 CMakeLists代码 1.2 要点1:POLICY 1.3 要点2:set_property 0. 前言 在MSVC工程上右键->属性,找到配置 ...

  4. #visual studio# 运行库MT、MTd、MD、MDd

    在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装相应的运行时库导致的,那么这个与编译选项MT.MTd.MD.MDd有什么关系呢?这是 ...

  5. 静态库、动态库、静态链接、动态链接、系统运行库混合、MD MT默认库冲突问题

    一.静态库项目 静态库lib:(注意和"静态运行库"区分)   就是.lib文件,一个.c或.cpp会编译成一个.obj,多个.obj可以组合成一个.lib库.lib=多个obj. ...

  6. /MTd /MD /MDd

    在编译 ATL 工程后,生成的 dll 在本电脑上能用,在别人的电脑上不能用.通过 Depends 工具分析一下,原来是编译选项没有选对,别的电脑上没有我生成的 dll 需要的基础 dll 文件,选成 ...

  7. VS配置选项MT和MD的区别

    目录 /MD./MT的选择 区别1:全局堆句柄不一样 区别2:链接的运行时库不同 区别3:编译出来的PE文件大小区别 visual studio运行时库MT.MTd.MD.MDd的研究 /MD./MT ...

  8. 关于多线程MT和MD的区别。

    /MD./MT的选择       1.为什么选择/MD,不选/MT?          (1)程序就不需要静态链接运行时库,可以减小软件的大小:          (2)所有的模块都采用/MD,使用的 ...

  9. 转载 关于多线程MT和MD的区别。

    这段时间司在招实习生,而不管是远程的电话面试或者是实际现场面试中领导都喜欢问你这个问题,但是可惜的是能很好答上来的人很少.后来发现不管是应届的实习生,甚至有些实际参加工作几年的人也未必真的了解这个问题 ...

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

    一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...

最新文章

  1. 天池NLP中文预训练模型赛来了!
  2. 招聘带来的Silverlight团队技能指标
  3. hdu4740 Sum
  4. iOS-NSData与NSDictionary的互相转换
  5. web前端技巧-ES6新特性与重点知识汇总(三)
  6. boost::interprocess::interprocess_condition用法的测试程序
  7. linux缓存代码,Linux使用的缓存
  8. Python实现访问者模式
  9. 女孩和程序员相亲,吃饭消费了380,他没结账就先走,晚上收到微信愣了
  10. 送专利啦~~ .Net高阶异常处理之TopLevelEH
  11. 6.5使用外部环境的属性文件
  12. 滚动插件 animatescroll(可以设置要滚动到位置)
  13. JAVA 二维码图片生成和base64位加密解密
  14. 文件对比软件Beyond Compare提示文件禁止编辑的解决方法
  15. U盘安装Ghost XP系统教程
  16. PythonTkinter 练习11之 自编工具 扫描地址段IP
  17. xml读取前面多一个?
  18. Exception:org.eclipse.m2e.wtp.MarkedException: Unable to configure OHBC
  19. 以word转PDF为例,免费的文档格式转换方法分享
  20. 技术人在互联网如何变现

热门文章

  1. Linux系统裁减之,制作一个极度精简的Linux-5-重新编译login去除对pam模块的依赖...
  2. Windows 10自动更新存在严重缺陷 强制升级搞坏用户硬盘!
  3. 【安全组网】思科IOS设备基础应用
  4. Oracle SQL性能调整注意事项
  5. Lotus notes 通讯录的导入导出
  6. js Promise理解,同时请求多个接口等
  7. ftp服务器文件上传代码,Java上传文件FTP服务器代码
  8. PHP打印Excel表格并下载
  9. YAF 接口 2016-10-27
  10. 在linux里安装python3.6环境,Python基础—环境准备之Python3.6 在Linux/Windows上安装