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
个运⾏时库。如下表:
C
运⾏时库
库⽂件
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
等等。