转载-- 动态、静态编译以及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的大小会很大。


猜你喜欢

转载自blog.csdn.net/qq_36122764/article/details/80483149
今日推荐