编译器选项:C++编译器选项设置



 编译参数设置主要通过IDE菜单项Project->Settings->C/C页来完成我们可以看到这最下面ProjectOptions中内容般如下:
  /nologo/MDd/W3/Gm/GX/ZI/Od/D"WIN32"/D"_DEBUG"/D"_WINDOWS"/D"_AFXDLL"/D"_M
  BCS"/Fp"Debug/WritingDlgTest.pch"/Yu"stdafx.h"/Fo"Debug/"/Fd"Debug/"/FD/GZ/c
  各个参数代表意义可以参考Msdn比如/nologo表示编译时不在输出窗口显示这些设置(我们可以把这个参数去掉来看看效果)等等般我们不会直接修改这些设置而是通过这页最上面Category中各项来完成
  1)General:些总体设置Warninglevel用来控制警告信息其中Level1是最严重级别;Warningsaserrors将警告信息当作处理;Optimizations是代码优化可以在CategoryOptimizations项中进行更细设置;Generatebrowseinfo用以生成.sbr文件记录类、变量等符号信息可以在CategoryListingFiles项中进行更多设置Debuginfo生成调试信息:None不产生任何调试信息(编译比较快);LineNumbersOnly仅生成全局和外部符号调试信息到.OBJ文件或.EXE文件减小目标文件尺寸;C7.0-Compatible记录调试器用到所有符号信息到.OBJ文件和.EXE文件;ProgramDatabase创建.PDB文件记录所有调试信息;ProgramDatabasefor"Edit&Continue"创建.PDB文件记录所有调试信息并且支持调试时编辑
  2)CLanguage:poer_to_memberrepresentation用来设置类定义/引用先后关系般为Best-CaseAlways表示在引用类的前该类肯定已经定义了;EnableExceptionHandling进行同步异常处理;EnableRun-TimeTypeInformation迫使编译器增加代码在运行时进行对象类型检查;DisableConstructionDisplacements设置类构造/析构问题
  3)CodeGeneration:Processor表示代码指令优化可以为80386、80486、Pentium、PentiumPro或者Blend表示混合以上各种优化Userun-timelibrary用以指定运行时使用运行时库(单线程或多线程Debug版本或Release版本)个原则就是个进程不要同时使用几个版本运行时库Single-Threaded静态连接LIBC.LIB库;DebugSingle-Threaded静态连接LIBCD.LIB库;Multithreaded静态连接LIBCMT.LIB库;DebugMultithreaded静态连接LIBCMTD.LIB库;MultithreadedDLL动态连接MSVCRT.DLL库;DebugMultithreadedDLL动态连接MSVCRTD.DLL库连接了单线程库就不支持多线程连接了多线程库就要求创建多线程应用
  Callingconvention可以用来设定约定有 3种:__cdecl、__fastcall和__stdcall各种约定主要区别在于参数是从左到右压入堆栈还是从右到左压入堆栈;在返回时者来清理压入堆栈参数还是由本身来清理;以及在编译时对名进行命名修饰(可以通过ListingFiles看到各种命名修饰方式)Structmemberalignment用以指定数据结构中成员变量在内存中是按几字节对齐根据计算机数据总线位数区别对齐方式存取数据速度不这个参数对数据包网络传输等应用尤为重要不是存取速度问题而是数据位精确定义问题般在中使用#pragmapack来指定
  4)Customize:DisableLanguageExtensions表示不使用微软为标准C做语言扩展;EliminateDuplicateStrings主要用于串优化(将串放到缓充池里以节省空间)使用这个参数使得
  char*sBuffer="Thisisacharacterbuffer";
  char*tBuffer="Thisisacharacterbuffer"; sBuffer和tBuffer指向是同块内存空间;EnableFunction-LevelLinking告诉编译器将各个按打包格式编译;Enablesminimalrebuild通过保存关联信息到.IDB文件使编译器只对最新类定义改动过源文件进行重编译提高编译速度;EnableIncrementalCompilation同样通过.IDB文件保存信息只重编译最新改动过;SuppressStartupBannerandInformationMessages用以控制参数是否在output窗口输出
  5)ListingFiles:Generatebrowseinfo功能上面已经提到过这里可以进行更多设置ExcludeLocalVariablesfromBrowseInfo表示是否将局部变量信息放到.SBR文件中Listingfiletype可以设置生成列表信息文件内容:Assembly-OnlyListing仅生成汇编代码文件(.ASM扩展名);AssemblyWithMachineCode生成机器代码和汇编代码文件(.COD扩展名);AssemblyWithSourceCode生成源代码和汇编代码文件(.ASM扩展名);Assembly,MachineCode,andSource生成机器码、源代码和汇编代码文件(.COD扩展名)Listingfilename为生成信息文件路径般为Debug或Release目录下生成文件名自动取源文件文件名
  6)Optimizations:代码优化设置可以选择MaximizeSpeed生成最快速代码或MinimizeSize生成最小尺寸或者Customize定制优化定制内容包括:
  AssumeNoAliasing不使用别名(提高速度);
  AssumeAliasingAcrossFunctionCalls内部不使用别名;
  GlobalOptimizations全局优化比如经常用到变量使用寄存器保存或者循环内计算优化


  i=-100;
  while(i<0){ix+y;}
  会被优化为
  i=-100;
  t=x+y;
  while(i<0){it;}
  GenerateIntrinsicFunctions使用内部替换(提高速度);
  ImproveFloatConsistency浮点运算方面优化;
  FavorSmallCode(exe或dll)尺寸优化优先于代码速度优化;
  FavorFastCode(exe或dll)代码速度优化优先于尺寸优化;
  Frame-PoerOmission不使用帧指针以提高速度;
  FullOptimization组合了几种参数以生成最快代码
  Inlinefunctionexpansion内联扩展 3种优化(使用内联可以节省开销加快速度):Disable不使用内联;Only__inline定义前有inline或__inline标记使用内联;AnySuitable除了inline或__inline标记编译器“觉得”应该使用内联都使用内联
  7)PrecompiledHeaders:预编译头文件设置使用预编译可以提高重复编译速度IDE般将些公共、不大变动头文件(比如afxwin.h等)集中放到stdafx.h中部分代码就不必每次都重新编译(除非是RebuildAll)
  8)Preprocessor:预编译处理可以定义/解除定义些常量Additionaldirectories可以指定额外包含目录般是相对于本项目目录如..\\Include
  连接参数设置主要通过IDE菜单项Project->Settings->Link页来完成我们可以看到这最下面ProjectOptions中内容般如下:
  /nologo/subsystem:windows/incremental:yes/pdb:"Debug/WritingDlgTest.pdb"/debug/machi
  ne:I386/out:"Debug/WritingDlgTest.exe"/pdbtype:sept下面我们分别来看下Category中各项设置
  1)General:些总体设置可以设置生成文件路径、文件名;连接库文件;Generatedebuginfo生成Debug信息到.PDB文件(具体格式可以在Category->Debug中设置);IgnoreAllDefaultLibraries放弃所有默认库连接;LinkIncrementally通过生成.ILK文件实现递增式连接以提高后续连接速度般这种方式下生成文件(EXE或DLL)较大;GenerateMapfile生成.MAP文件记录模块相关信息;EnableProfiling这个参数通常和GenerateMapfile参数同时使用而且如果产生Debug信息不能用.PDB文件而且必须用MicrosoftFormat
  2)Customize:这里可以进行使用数据库文件设置ForceFileOutput强制产生输出文件(EXE或DLL);PrProgressMessages可以将连接过程中进度信息输出到Output窗口
  3)Debug:设置是否生成调试信息以及调试信息格式格式可以有MicrosoftFormat、COFFFormat(CommonObjectFileFormat)和BothFormats 3种选择;SeparateTypes表示将Debug格式信息以独立.PDB文件存放还是直接放在各个源文件.PDB文件中选中表示采用后者方式这种方式调试启动比较快
  4)Input:这里可以指定要连接库文件放弃连接库文件还可以增加额外库文件目录般是相对于本项目目录如..\\LibForceSymbolReferences可以指定连接特定符号定义
  5)Output:BaseAddress可以改变默认基地址(EXE文件默认为0x400000DLL默认为x10000000)操作系统装载时总是试着先从这个基地址开始Entry-PoSymbol可以指定入口地址般为名(且必须采用__stdcall约定)般Win32EXE入口为WinMainDLL入口为DllEntryPo;最好让连接器自动设置入口点默认情况下通过个C运行时库来实现:控制台采用CRTStartup(或wCRTStartup)去(或w);Windows采用WinMainCRTStartup(或wWinMainCRTStartup)WinMain(或wWinMain必须采用__stdcall约定);DLL采用_DllMainCRTStartupDllMain(必须采用__stdcall约定)Stackallocations用以设置使用堆栈大小(请使用十进制)默认为1兆字节VersionInformation告诉连接器在EXE或DLL文件开始部分放上版本号
  值得注意上面各个参数是大小写敏感;在参数后加上“-”表示该参数无效;各个参数值选项
  有“*”表示为该参数默认值;可以使用页右上角“Re”按钮来恢复该页所有默认设置
  其它些参数设置
  1)Project->Settings->General可以设置连接MFC库方式(静态或动态)如果是动态连
  接在你软件Software发布时不要忘了带上MFCDLL
  2)Project->Settings->Debug可以设置调试时运行可执行文件以及命令行参数等
  3)Project->Settings->CustomBuild可以设置编译/连接成功后自动执行些操作比较有
  用写COM时希望IDE对编译通过COM文件自动注册可以如下设置:
  Description:RegisterCOM
  Commands:regsvr32/s/c$(TargetPath)
  echoregsvr32exe.time>$(TargetDir)\\$(TargetName).trg
  Outputs:$(TargetDir)\\$(TargetName).trg
  4)Tools->Options->Directories设置系统Include、Library路径
  些小窍门(针对VisualC)
  1)有时候你可能在编译时候计算机突然非法关机了(可能某人不小心碰了电源或你内存不稳定等原因)当你重启机器后打开刚才项目重新进行编译发现IDE会崩掉你或许以为你编译器坏了其实不然(你试试编译其它项目还是好!)你只要将项目.ncb、.opt、.aps、.clw文件以及Debug、Release目录下所有文件都删掉然后重新编译就行了


  2)如果你想和别人共享你源代码项目但是把整个项目做拷贝又太大你完全可以删掉以下文件:.dsw、.ncb、.opt、.aps、.clw、.plg文件以及Debug、Release目录下所有文件
  3)当你Workspace中包含多个Project时候你可能不能直观地、眼看出来哪个是当前项目可以如下设置:Tools->Options->Format然后在Category中选择Workspacewindow改变其默认字体(比如设成Fixedsys)就行了
  4)如何给已有Project改名字?将该Project关掉然后以文本格式打开.dsp文件替换原来Project名字即可
  5)VC6对类成员智能提示功能很有用但有时候会失灵你可以先关掉项目将.clw和.ncb删掉然后重新打开项目点击菜单项View->ClassWizard在弹出对话框中按下“AddAll”按钮;重新RebuildAll应该可以解决问题
Tags:  标准c编译器 c编译器 c语言编译器 编译器选项

延伸阅读

最新评论

发表评论