动态静态编译以及MDMDdMTMTd编译

Posted yq2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态静态编译以及MDMDdMTMTd编译相关的知识,希望对你有一定的参考价值。

本文转自: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的大小会很大。















以上是关于动态静态编译以及MDMDdMTMTd编译的主要内容,如果未能解决你的问题,请参考以下文章

静态联编译和动态联编译

如何编译C/Fortran动态/静态链接库

静态语言和动态语言,解释和编译

开源库的使用方法以及libjpeg的移植详解

apache动态编译与静态编译

C/C++编译问题,静态库,动态库。