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

原文地址:https://www.cnblogs.com/YQ2014/p/9714370.html

时间: 2024-10-10 07:57:52

动态、静态编译以及MD、MDd、MT、MTd编译的相关文章

md/mdd/mt/mtd

  名称 说明 mt   多线程 定义了_MT 并使编译器将库名 LIBCMT.lib 放入 .obj 文件中  mtd    多线程调试 定义_DEBUG 和 _MT.此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中 md   多线程DLL 定义了_MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj文件中. mdd   多线程DLL调试 定义_DEBUG._MT 和 _DLL,将MSVCRTD.lib 放入 .obj 文件中. 注意: 使用相同的编

(转)VC运行库MD /MDd /MT /MTd /ML /MLd

VC编译选项 - 多线程(/MT) - 多线程调试 (/MTd) - 多线程DLL (/MD) - 多线程调试DLL (/MDd) C 运行时库 库文件 - Single thread(static link) ML libc.lib - Debug single thread(static link) MLd libcd.lib - MultiThread(static link) MT libcmt.lib - Debug multiThread(static link) MTd libcm

VC代码生成里面的/MT /MTd /MD /MDd的意思

VC代码生成里面的/MT /MTd /MD /MDd的意思. 意思上已经很明白了.但是往往很多人弄不清楚到底怎么选择. /MT是 "multithread, static version " 意思是多线程静态的版本. 定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号. /MD是 "multithread- and DLL-specific version" ,意思是多线程DLL版本,定义了它后,编译器把MS

Linux下快速静态编译Qt以及Qt动态/静态版本共存

Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-opensource-src的tar包,到网上一查,乖乖,大部分人编译这个包居然花费了12-13个小时!但是,根据我在Windows下静态编译Qt的经验,其实这之中很多东西都是可以不用编译的,最终我大约用了40分钟编译完成了全部内容.如果你直接使用官方的sdk安装,那么你就已经有了一个动态库,现在你又通过源

linux 动态静态库

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.  1  静态库和动态库的区别1.1. 静态函数库    (1)静态函数库的名字一般是lib[name].a(2)利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,它的优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.这给它带来的缺点为如果静态函数库改变了,那么你的程序必须重新编译.1.2. 动态函数库    (1)动态函数库的名字一般是li

web项目动态静态的区别

1.静态页面就是设计者把页面上所有东西都设定好.做死了,然后放上去,不管是谁在任何时候看到的页面内容都是一样的,一成不变(除非手动修改页面内容).静态html页面文件,可以直接用本地的浏览器打开.比如:file:///Users/Phil/Documents/DevOps/HBuilderProjects/testJSP/index.html. 2.动态页面的内容一般都是依靠服务器端的程序来生成的,不同人.不同时候访问页面,显示的内容都可能不同.网页设计者在写好服务器端的页面程序后,不需要手工控

简单程序的编译链接三种方法(编译多个源文件,静态链接库、动态链接库)

一个程序简单的程序如下: 1 hello.h #ifndef HELLO_H#define HELLO_H void hello(const char *name); #endif 2 hello.c #include <stdio.h>#include <stdlib.h> void hello(const char *name){ printf("hello %s\n",name);} 3 main.c #include <stdio.h>#in

VS2008编译器编译出来的文件比mingw编译的要几乎小一半

为什么要在VS2008中使用QT静态编译呢?很简单,因为VS2008编译器编译出来的文件比mingw编译的要几乎小一半. 好了现在我们来做些准备工作,VS2008自然要安装的,然后打上SP1的补丁.然后我们要到QT主页下载,QT4.7.4版的源码包 qt-everywhere-opensource-src-4.7.4.zip,因为用源码包编译没那么容易出错:另外还有QT for VS 的插件 qt-vs-addin-1.1.9.exe,这两个准备好就可以开始安装了. 第一步: 把源码 包qt-e

关于T-SQL重编译那点事,WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗

本文出处:http://www.cnblogs.com/wy123/p/6262800.html   在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的其他因素的情况下,比如重建索引,更新统计信息等等), 一是基于WITH RECOMPILE的存储过程级别重编译,另外一种是基于OPTION(RECOMPILE)的语句级重编译. 之前了解的比较浅,仅仅认为是前者就是编译整个存储过程中的所有的语句,后者是重编译存储过程中的某一个语句,也没有追究到底是不