一:简介
1.1基本设置
先介绍先介绍Visual Studio里的几个输出的设置及一些文件的作用,后面用到
OutPut Directory ,它的值不会直接影响到你文件的输出,但它会间接的影响其他输出,
比方说默认值中包含有$(OutDir).
Intermediate Directory ,中间目录,生成的obj文件,预编译头,
预编译相关的idb及pdb,buildlog都会在这里.
idb 是系统生的成的状态信息,可以加速随后的编译
pdb 包含调试信息
Linker->General->OutPut File,输出文件,虽然填的是exe的路径,但.ilk文件会按这个路径输出.
Linker->Debugging->Genrerate Program Database File,输出的pdb文件
Linker->Advanced->Import Library 指示了将随同dll生成的lib文件输出的文件名和路径
DSW:全称是Developer Studio Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,她是一个纯文本的文件,在vc创建新项目的时候自动生成
DSP:全称是Developer Studio Project,也是一个配置文件,不过她记录的是一个项目的所有配置信息,纯文本文件
OPT:与DSW、DSP配合使用的配置文件,她记录了与机器硬件有关的信息,同一个项目在不同的机器上的opt文件内容是不同的
CLW:记录了跟ClassWizard相关的信息,如果丢失了clw文件,那么在Class View面板里就没有类信息
PLG:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程,是一个日志型文件
RC:资源描述文件,记录了所有的资源信息,在资源编辑器里作的修改,实际上都是对RC文件的修改
RC2:附加的资源描述文件,不能直接资源编辑器修改,只能手工添加,可以用来添加额外的资源
RES:经过资源编辑器编译之后的资源文件,以二进制方式存放
SBR:编译器生成的浏览信息文件,在代码导航的时候非常有用,她需要在编译时指定/FR或者/Fr开关
BSC:BSCMAKE.EXE将所有的SBR文件作为输入,经过处理之后输出一个BSC文件,
在代码导航的时候实际用到的是BSC文件
ILK:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息
PDB:全称是Program DataBase,即程序数据库文件,用来记录调试信息,
是一个相当重要的文件,没有他,程序无法正常调试
LIB:如果项目输出是Dll的话,一般会输出一个跟项目同名的Lib文件,记录输出的函数信息
EXP:同Lib,是跟Dll一起生成的输出文件
PCH:全称是PreCompiled Header,就是预先编译好的头文件,在编译时指定/Yu开关时编译器自动生成
关于,ilk文件及渐增式编译连接
1.2 程序生成设置
生成独立可执行一般应用程序的设置
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 libcmtd.lib
MultiThread(dynamic link) MD msvert.lib
Debug multiThread(dynamic link) MDd msvertd.lib
1.3. 各种 C 运行时库的区别
( 1 )静态链接的单线程库
静态链接的单线程库只能用于单线程的应用程序, C 运行时库的目标代码最终被编译在应用程序的二进制文件中。
通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线程库。
( 2 )静态链接的多线程库
静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
( 3 )动态链接的运行时库
动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中,
MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态链接的运行时库。
/MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ) ,
与 /MD 、 /ML 或 /MT 分别对应。
Debug 版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,
加强了对错误的检测,因此在运行性能方面比不上 Release 版本。
下面是msdn关于Visual C++ 编译器选项的说明:
这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。
选项 说明
/MD 定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。
此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链
接的应用程序可用。
当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接
,同时仍通过 msvcrt.lib 动态链接到主 CRT。
/MDd 定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
/ML 使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。
/MLd 定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。
/MT 定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析
外部符号。创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
/MTd 定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使
用 LIBCMTD.lib 解析外部符号。创 建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
/LD 创建 DLL。
将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
链接 DLL 启动代码。
如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。
如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。
/LDd 创建调试 DLL。定义 _DEBUG。
警告 不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。
例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非 DLL)版本的运行时库链接的动态链接库可能导致问题。
(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。
二:优化和减肥工程体积步骤
相信用过微软vs2010的开发者们,会注意到一个常见的问题。
就是我们每次创建的工程目录下默认自动生成的文件体积相当庞大。
举个例子吧。本人经过测试一个MFC的SDI程序在静态库的模式下编译,链接生成。
整个工程的体积大到260M左右。
先创建一个默认的MFCSDI工程,然后生成,目录以及文件如下
注意看,影响工程体积的主要那些文件
1 MFCSDI.SDF文件 63M
2 MFCSDI文件夹内的所有文件(分别是在Debug目录和Release目录下同样存在的.pch文件.)2*39=78
3 MFCSDI.sdf 96M
这三个最大的文件加起来大小约63+78+96=237(M)
下面就看我们怎么把这些冗余文件优化掉。
1
Tools->Options->Text Editor->C/C++->Advanced->Disable Database,设置为True
但是这样的办法会产生另外的一些问题,可能会导致其他的一些功能不能使用。但是
不是每个都有用的,具体根据你的工程类型和项目需要。
2
Tools->Options->Text Editor->C/C++->Advanced,在 Fallback Location 的属性组中,
将"Always Use Fallback Location"设置为 true,将"Do Not Warn If Fallback Location Used"
设置为 true
3 转移PCH预编译文件,先创建一个临时目录为2010TEMP,然后在里面创建pch文件夹,最后在创建两个文件夹一个为Debug一个为Release
路径为C:\2010TEMP\pch\debug\和C:\2010TEMP\pch\release\
这里注意预编译头文件不能禁止,所谓的预编译头就是把一个工程中的那一部分代码,
预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件
这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,
在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。
注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有20-30M大。
注意及时清理那些没有用的预编译头文件。
三:结语
经过以上步骤,最后编译,链接,建立Debug和Release模式下两个可执行文件
经过检测最终的整个MFCSDI工程文件大小为25M左右。呵呵。
怎么样,终于减肥了吧。
希望对你有所帮助。