zoukankan      html  css  js  c++  java
  • 动态、静态编译以及MD、MDd、MT、MTd编译

    本文转自:https://blog.csdn.net/u012273127/article/details/71419499

    一、问题的引出

    最近在VS2012中新建了一个MFC的工程,在自己电脑上运行很好,但是当拷贝到同学电脑上的时候一直出现“差dll”或者是“应用程序无法启动”的错误。后来找出原因,是自己编译的时候选择静态还是动态编译的问题。
    解决办法1:让同学安装了VS2012,注意这里必须是和自己编译器相同的版本,比如是2013就不行。
    解决办法2:在自己这边用静态编译,重新生成可执行文件即可。

    二、动态和静态编译的区别

    1、区别:动态编译的生成的可执行文件的exe小,但是运行需要系统环境具有相关的dll文件,就是动态调用系统相关的文件才能运行;静态编译生成的可执行文件exe大,但是运行的时候不依赖于系统环境所依赖的dll和lib等环境问题,在编译的时候已经这些dll相关文件编译进了exe文件,所以exe文件较大,但是执行的时候不会依赖于系统环境。所以需要自己创建的工程需要在别的电脑上运行,考虑到稳定性,同时对执行文件的大小没有要求的话还是尽量选择静态编译。
    2、VS中两种编译状态的设置:在工程的“属性”中进行修改。具体截图如下:
    这里写图片描述
    共享dll – 动态编译;静态库中使用 – 静态编译。

    三、MD、MDd、MT、MTd编译

    1、设置:在设置动态和静态编译后就需要对“C/C++ –> 代码生成 –> 运行库”进行设置,具体截图如下:

    这里写图片描述
    2、编译形式和四种运行库的配置关系如下:
    (1)、静态编译: debug状态下 – MTd; release状态下 – MT
    (2)、动态编译: debug状态下 – MDd;release状态下 – MD
    记住:静态编译为T,动态编译为D,debug下有个字母d,release下没有字母d

    四、测试

    在VS2012中新建一个MFC对话框工程,分别配置和设置。
    1、动态编译debug下: exe大小为185KB
    2、动态编译release下: exe大小为88.5KB(release版本下少了很多中间文件所以比debug下的小)
    3、静态编译debug下: exe大小为8.81MB
    4、静态编译release下: exe大小为3.37MB(release版本下少了很多中间文件所以比debug下的小)
    可以明显注意到静态编译的生成的exe文件比动态生成的exe文件要大很多,因为编译的时候将相应的dll也编译进去exe之中,所以exe的大小会很大。

  • 相关阅读:
    在有多个input的表单当中按回车按钮,如何不自动提交表单,而触发某个按钮的事件
    login.jsp
    json数据源
    translation.js
    cookie.js
    i18next.min.js
    struts2拦截器实现原理
    proxy-target-class="true" 与proxy-target-class="false"的区别(声明事务的时候)
    NavLink
    【转载】target='_blank' 安全漏洞示例
  • 原文地址:https://www.cnblogs.com/YQ2014/p/9714370.html
Copyright © 2011-2022 走看看