动态库 静态库 区别,VS中Debug和Realease、及静态库和动态库的区别整理

VS

Debug

Realease

、及静态库和动态库的区别整理

⼀、

Debug

Realease

区别产⽣的原因

Debug 

通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 

称为发布版本,它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上

都是最优的,以便⽤户很好地使⽤。

Debug 

 Release 

的真正区别,在于⼀组编译选项。

Debug 

版本

参数

 

含义

/MDd /MLd 

 /MTd 

使⽤

 Debug runtime library(

调试版本的运⾏时刻函数库

)

/Od 

关闭优化开关

/D "_DEBUG" 

相当于

 #define _DEBUG,

打开编译调试代码开关

(

主要针对

assert

函数

)

/ZI

创建

 Edit and continue(

编辑继续

)

数据库,这样在调试过程中如果修改了源代码不需重新编译

GZ 

可以帮助捕获内存错误

Release 

版本

参数

 

含义

/MD /ML 

 /MT 

使⽤发布版本的运⾏时刻函数库

/O1 

 /O2 

优化开关,使程序最⼩或最快

/D "NDEBUG" 

关闭条件编译调试代码开关

(

即不编译

assert

函数

)

/GF 

合并重复的字符串,并将字符串常量放到只读内存,防⽌被修改

Debug 

 Release 

并没有本质的界限,他们只是⼀组编译选项的集合,编译器只是按照预定的选项⾏动。

⼆、

Debug

Realease

区别的表现

I. 

内存分配问题

1. 

变量未初始化。下⾯的程序在

debug

中运⾏的很好。

thing * search(thing * something)

BOOL found;

for(int i = 0; i field == something->field)

{ /* found it 

/

found = TRUE;

break;

} /

 found it */

}

if(found)

return whatever[i];

else

return NULL;

⽽在

release

中却不⾏,因为

debug

中会⾃动给变量初始化

found=FALSE,

⽽在

release

版中则不会。所以尽可能的给变量、类或结构初始化。

2. 

数据溢出的问题

如:

char buffer[10];

int counter;

lstrcpy(buffer, "abcdefghik");

debug

版中

buffer

NULL

覆盖了

counter

的⾼位,但是除⾮

counter>16M,

什么问题也没有。但是在

release

 

中,

counter

可能被放在寄存器中,这样

NULL

就覆盖了

buffer

下⾯的

空间,可能就是函数的返回地址,这将导致

ACCESS ERROR

3. 

DEBUG

版和

RELEASE

版的内存分配⽅式是不同的

 

。如果你在

DEBUG

版中申请

 ele 

 6*sizeof(DWORD)=24bytes,

实际上分配给你的是

32bytes

debug

版以

32bytes

为单

位分配),

 

⽽在

release

版,分配给你的就是

24bytes

release

版以

8bytes

为单

 

位),所以在

debug

版中如果你写

ele[6],

可能不会有

 

什么问题,⽽在

release

版中,就有

ACCESS VIOLATE

相关经验,转⾃

http://www.cnblogs.com/JemBai/archive/2009/01/13/1374805.html

三、静态库和动态库的区别

静态连接库就是把

(lib)

⽂件中⽤到的函数代码直接链接进⽬标程序,程序运⾏的时候不再需要其它的库⽂件;动态链接就是把调⽤的函数所在⽂件模块(

DLL

)和调⽤函数在⽂件中的位置等信息链接进⽬标程序,程序运⾏的时候再从

DLL

中寻找相应函

静态编译只需要所需的头⽂件和对应的

lib

库⽂件。

动态编译则需要所需的头⽂件、对应的

lib

库⽂件以及对应的

dll

库⽂件。

事实上,静态编译⽤到的库⽂件和动态编译⽤到的库⽂件有本质区别:前者静态库是⼀个或者多个

obj

⽂件的打包,所以有⼈⼲脆把从

obj

⽂件⽣成

lib

的过程称为

Archive

,即合并到⼀起。⽐如你链接⼀个静态库,如果其中有错,它会准确的找到是哪个

四、

VS

/MT

/MD

/MTd

/MDd

的区别

1.Overview

⽬前,在

VS

中提供的运⾏时库分为静态链接库和动态链接库两类,⽽每⼀类运⾏时库⼜可再分为

 debug 

版和

 release 

版,因此

VS

共提供了

 4 

个运⾏时库。如下表:

运⾏时库

                             

库⽂件

MultiThread(static link) MT            libcmt.lib

Debug multiThread(static link) MTd     libcmtd.lib

MultiThread(dynamic link) MD           msvert.lib

Debug multiThread(dynamic link) MDd    msvertd.lib

2.

各运⾏时库的区别

a.

静态链接的多线程库

  静态链接的多线程库的⽬标代码也最终被编译在应⽤程序的⼆进制⽂件中,但是它可以在多线程程序中使⽤。通过

 /MT 

编译选项可以设置

 Visual C++ 

使⽤静态链接的单线

程库。

 

 b.

动态链接的运⾏时库

  动态链接的运⾏时库将所有的

 C 

库函数保存在⼀个单独的动态链接库

 MSVCRTxx.DLL 

中,

 MSVCRTxx.DLL 

处理了多线程问题。使⽤

 /MD 

编译选项可以设置

 Visual C++

使⽤动态链接的运⾏时库。

  

/MDd 

 /MTd 

选项使⽤

 Debug runtime library( 

调试版本的运⾏时刻函数库

 ) 

,与

 /MD 

 /MT 

分别对应。

 Debug 

版本的

 Runtime Library 

包含了调试信息,并采⽤了⼀些保

护机制以帮助发现错误,加强了对错误的检测,因此在运⾏性能⽅⾯⽐不上

 Release 

版本。

3.

运⾏时库的选择

根据最近的项⽬经验,如果项⽬中包含了其它编译好的

lib

静态库⽂件,就使⽤

/MT

总之要保持⼀致性。否则可能会出现链接错误:

LINK2005

LINK2038

等等。

静态库生成动态库静态库和动态库优缺点动态库和静态库的区别 知乎静态库和动态库的生成c++ 动态库静态库动态库 静态库 性能静态库和动态库的使用动态库静态库区别动态库静态库区别 链接动态库静态库区别iOS什么是静态库和动态库动态库和静态库的使用静态库和动态库的基本含义动态库包含静态库简述静态库与动态库的概念及差异静态库与动态库的区别与优缺点静态库是什么圣诞节去哪里玩更浪漫知乎短篇小说甜文完结实尾岛事件处理iphone不识别sim卡年轻人记忆力变差唐人街探案3大概什么时候能上映儿童剧演出订票这个杀手不太冷剧情整理壮阳药潮剧有哪些90后的网络游戏