zoukankan      html  css  js  c++  java
  • 链接时如何选择C RunTime(CRT) library

    链接时如何选择C Run-Time(CRT) library

    链接时如何选择C Run-Time(CRT) library
     

    在Windows下有六种类型CRTLib(C运行库):
    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

    MT和MD都适用于多线程,其区别是:
    MT为静态链接CRT,这样编译出来exe是自包含的,所以会相对大一些,但运行时不用再load CRT库。
    MD为动态链接CRT,编译出来exe会小一些,运行时需要load CRT,性能有一点点损失。

    任何工程都应该使用同样的CRT Library。即要么都是/ML,要么都是/MTD, 如此类推。

    如果一个程序中混合使用不同类型的CRT,有时可以通过link,这样会存在不同CRT的copy,并导致以下问题:
        1)在一个lib中new出来内存,在另一个lib中delete,会crash。
        2)不能在多个lib中共享file handle。
        3)一个lib中设置locale(本地化有关),不能在另一个lib中起作用。

    当工程比较大,包含的lib很多,特别当有外部lib(Third party library)存在时,link很容易发生下面这样的错误。
    LIBCMTD.lib(chsize.obj) : error LNK2005: __chsize already defined in MSVCRTD.lib(MSVCRTD.dll)
    这说明,你的工程使用了不同类型的CRT。这个时候首先一定要坚信这个原则:整个工程用同样的CRT Lib就可以解决问题。然后耐心一一检查每个lib。
    如果恰恰某个外部lib用MT,另一个用MD,这个时候就比较痛苦。
        如果有他们源码,就编译一个MT or MD类型的lib,以统一使用一个类型CRT。
        如果没有,那可能只好选择其他的lib。

  • 相关阅读:
    AWR报告-数据库概要信息(一)
    性能tips
    linux脚本随笔-01
    小和问题 和逆序对问题
    SpringMVC 学习笔记(拦截器的配置))
    删除eclipse Maven 进程 导致eclipse的workspace 启动不了
    SpringMVC 学习笔记(请求方法的返回值和参数)
    SpringMVC 学习笔记(处理器映射器的配置)
    (转)Maven 项目新建index.jsp报错问题
    MyBatis 学习总结(1)
  • 原文地址:https://www.cnblogs.com/goodcandle/p/1240758.html
Copyright © 2011-2022 走看看