




免费预览已结束,剩余50页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020/5/22,Linux及编程,1,编程工具包,GNUCC(GNUCompilerCollection)GNUmake管理项目GDB(GNUDeBugger)调试,2020/5/22,Linux及编程,2,GNUCC,GCC的特性面向多种语言C,C+,ObjectiveC,Pascal,Ada,Fortran能够对编译过程有更多的控制可以控制嵌入在二进制执行文件中调试代码的数量和类型可以优化执行代码有30多个警告和3个一般警告级可以进行交叉编译对C和C+进行了大量扩展,2020/5/22,Linux及编程,3,GNUCC,C程序的编译过程,2020/5/22,Linux及编程,4,GNUCC,实例,2020/5/22,Linux及编程,5,GNUCC,实例,在预处理后停止编译过程,2020/5/22,Linux及编程,6,GNUCC,实例,从指定的步骤开始编译,只编译不链接,2020/5/22,Linux及编程,7,GNUCC,对文件扩展名的解释Foranygiveninputfile,thefilenamesurfixdetermineswhatkindofcompilationisdone.file.cCsourcecodewhichmustbepreprocessed.file.iCsourcecodewhichshouldnotbepreprocessed.file.iiC+sourcecodewhichshouldnotbepreprocessed.file.hCorC+headerletobeturnedintoaprecompiledheader.file.cc,file.cp,file.cxx,file.cpp,file.CPP,file.c+,file.CC+sourcecodewhichmustbepreprocessed.Notethatin.cxx,thelasttwolettersmustbothbeliterallyx.Likewise,.CreferstoaliteralcapitalC.file.hh,file.HC+headerfiletobeturnedintoaprecompiledheader.file.sAssemblercode.file.SAssemblercodewhichmustbepreprocessed.,2020/5/22,Linux及编程,8,GNUCC,常用的命令行选项-xlanguageSpecifyexplicitlythelanguageforthefollowinginputfiles(ratherthanlettingthecompilerchooseadefaultbasedonthefilenamesuffix).Thisoptionappliestoallfollowinginputfilesuntilthenext-xoption.Possiblevaluesforlanguageare:cc-headercpp-outputc+c+-headerc+-cpp-outputassemblerassembler-with-cpp-xnoneTurnoffanyspecificationofalanguage,sothatsubsequentfilesarehandledaccordingtotheirfilenamesuffixes(astheyareif-xhasnotbeenusedatall).,2020/5/22,Linux及编程,9,GNUCC,常用的命令行选项-x和下述几个选项结合实现分步编译-cCompileorassemblethesourcefiles,butdonotlink.-SStopafterthestageofcompilationproper;donotassemble.-EStopafterthepreprocessingstage;donotrunthecompilerproper.-ofilePlaceoutputinfilefile.If-oisnotspecified,thedefaultistoputanexecutableleina.out,theobjectfileforsource.suffixinsource.o,itsassemblerfileinsource.s,andallpreprocessedCsourceonstandardoutput.-vPrint(onstandarderroroutput)thecommandsexecutedtorunthestagesofcompilation.-#Like-vexceptthecommandsarenotexecutedandallcommandargumentsarequoted.Thisisusefulforshellscriptstocapturethedriver-generatedcommandlines.Notethatsomecombinations(forexample,-xcpp-output-E)instructgcctodonothingatall.,2020/5/22,Linux及编程,10,GNUCC,常用的命令行选项下述选项控制C(C+)的“方言”-ansiInCmode,supportallISOC89programs.InC+mode,removeGNUextensionsthatconflictwithISOC+.-std=Determinethelanguagestandard.c89,iso9899:1990ISOC90(sameas-ansi).iso9899:199409ISOC90asmodiedinamendment1.c99,c9x,iso9899:1999,iso9899:199xISOC99.gnu89Default,ISOC90plusGNUextensions(includingsomeC99features).gnu99,gnu9xISOC99plusGNUextensions.WhenISOC99isfullyimplementedinGCC,thiswillbecomethedefault.Thenamegnu9xisdeprecated.c+98The1998ISOC+standardplusamendments.gnu+98Thesameas-std=c+98plusGNUextensions.ThisisthedefaultforC+code.,2020/5/22,Linux及编程,11,GNUCC,常用的命令行选项警告信息CanrequestmanyspecificwarningswithoptionsbeginningW.-fsyntax-onlyCheckthecodeforsyntaxerrors,butdontdoanythingbeyondthat.-pedanticIssueallthewarningsdemandedbystrictISOCandISOC.-pedantic-errorsLike-pedantic,exceptthaterrorsareproducedratherthanwarnings.-wInhibitallwarningmessages.-Wchar-subscriptsWarnifanarraysubscripthastypechar.-WcommentWarnwhenever注释嵌套.-WformatCheckcallstoprintfandscanf,etc.,tomakesurethattheargumentssuppliedhavetypesappropriatetotheformatstringspecified,andthattheconversionsspecifiedintheformatstringmakesense.,2020/5/22,Linux及编程,12,GNUCC,常用的命令行选项警告信息-WnonnullEnablewarningaboutpassinganullpointerforargumentsmarkedasrequiringanon-nullvaluebythenonnullfunctionattribute.-Wimplicit-intWarnwhenadeclarationdoesnotspecifyatype.-Wimplicit-function-declaration-Werror-implicit-function-declarationGiveawarning(orerror)wheneverafunctionisusedbeforebeingdeclared.-WmainWarnifthetypeofmainissuspicious.-Wmissing-bracesWarnifanaggregateorunioninitializerisnotfullybracketed.Forexample,inta22=0,1,2,3.-WparenthesesWarnifparenthesesareomittedincertaincontexts,suchaswhenthereisanassignmentinacontextwhereatruthvalueisexpected.E.g.if(a=2).,2020/5/22,Linux及编程,13,GNUCC,常用的命令行选项警告信息-Wreturn-typeWarnwheneverafunctionisdefinedwithareturn-typethatdefaultstoint.-WswitchWarnwheneveraswitchstatementhasanindexofenumeraltypeandlacksacaseforoneormoreofthenamedcodesofthatenumeration.-Wswitch-defaultWarnwheneveraswitchstatementdoesnothaveadefaultcase.-Wunused-functionWarnwheneverastaticfunctionisdeclaredbutnotdefinedoranon-inlinestaticfunctionisunused.-Wunused-labelWarnwheneveralabelisdeclaredbutnotused.-Wunused-parameterWarnwheneverafunctionparameterisunusedasidefromitsdeclaration.-Wunused-variableWarnwheneveralocalvariableornon-constantstaticvariableisunusedasidefromitsdeclaration.-WunusedAlltheabove-Wunusedoptionscombined.,2020/5/22,Linux及编程,14,GNUCC,常用的命令行选项警告信息-WuninitializedWarnifanautomaticvariableisusedwithoutristbeinginitializedorifavariablemaybeclobberedbyasetjmpcall.-WallAlloftheabove-Woptionscombined.-Wsystem-headersPrintwarningmessagesforconstructsfoundinsystemheaderfiles.-Wfloat-equalWarniffloatingpointvaluesareusedinequalitycomparisons.-WundefWarnifanundefinedidentifierisevaluatedinan#ifdirective.-Wunreachable-codeWarnifthecompilerdetectsthatcodewillneverbeexecuted.-WinlineWarnifafunctioncannotbeinlinedanditwasdeclaredasinline.-WerrorMakeallwarningsintoerrors.,2020/5/22,Linux及编程,15,GNUCC,常用的命令行选项警告信息的实例有问题的源程序,2020/5/22,Linux及编程,16,GNUCC,常用的命令行选项警告信息的实例默认的编译过程,2020/5/22,Linux及编程,17,GNUCC,常用的命令行选项警告信息的实例找出printf格式的编译过程,2020/5/22,Linux及编程,18,GNUCC,常用的命令行选项警告信息的实例找出比较使用了附值和注释嵌套的编译过程,2020/5/22,Linux及编程,19,GNUCC,常用的命令行选项警告信息的实例找出变量为初始化的编译过程,2020/5/22,Linux及编程,20,GNUCC,常用的命令行选项调试选项-gProducedebugginginformationintheoperatingsystemsnativeformat(stabs,COFF,XCOFF,orDWARF).GDBcanworkwiththisdebugginginformation.-ggdbProducedebugginginformationforusebyGDB.-ftime-reportMakesthecompilerprintsomestatisticsaboutthetimeconsumedbyeachpasswhenitfinishes.-fmem-reportMakesthecompilerprintsomestatisticsaboutpermanentmemoryallocationwhenitfinishes.,2020/5/22,Linux及编程,21,GNUCC,常用的命令行选项调试选项-O-O1Optimizingcompilationtakessomewhatmoretime,andalotmorememoryforalargefunction.With-O,thecompilertriestoreducecodesizeandexecutiontime,withoutperforminganyoptimizationsthattakeagreatdealofcompilationtime.-O2Optimizeevenmore.-O3Optimizeyetmore.-O0Donotoptimize.Thisisthedefault.-OsOptimizeforsize.,2020/5/22,Linux及编程,22,GNUCC,常用的命令行选项控制预处理的选项-DnamePredefinenameasamacro,withdefinition1.-Dname=definitionPredefinenameasamacro.-UnameCancelanypreviousdefinitionofname,eitherbuiltinorprovidedwitha-Doption.-undefDonotpredefineanysystem-specificorGCC-specificmacros.Thestandardpredefinedmacrosremaindefined.,2020/5/22,Linux及编程,23,GNUCC,常用的命令行选项控制文件搜索路径-IdirAddthedirectorydirtothelistofdirectoriestobesearchedforheaderfiles.Directoriesnamedby-Iaresearchedbeforethestandardsystemincludedirectories.-llibrary-LlibrarySearchthelibrarynamedlibrary(liblibrary.a)whenlinking.,2020/5/22,Linux及编程,24,GNUCC,常用的命令行选项体系结构相关-mtune=cpu-typeTunetocpu-typeeverythingapplicableaboutthegeneratedcode,exceptfortheABIandthesetofavailableinstructions.Thechoicesforcpu-typearei386,i486,i586,i686,pentium,pentium-mmx,pentiumpro,pentium2,pentium3,pentium4,k6,k6-2,k6-3,athlon,athlon-tbird,athlon-4,athlon-xp,athlon-mp,winchip-c6,winchip2,k8,c3andc3-2.-march=cpu-typeGenerateinstructionsforthemachinetypecpu-type.-mieee-fp-mno-ieee-fpControlwhetherornotthecompilerusesIEEEfloatingpointcomparisons.-m32-m64Generatecodefora32-bitor64-bitenvironment.,2020/5/22,Linux及编程,25,GNUmake管理项目,最主要也是最基本的功能:通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。GCCmake的特性让用户将包含大量甚至特殊编译选项的长而复杂的编译命令只写一次,而多次使用减少重复编译所需要的时间通过构建依赖信息数据库,可以让make在每次编译前检查是否可以找到所有需要的文件可以让用户建立一个稳定的编译环境可以让编译过程自动执行(通过shellscript或cron调用),2020/5/22,Linux及编程,26,GNUmake管理项目,编译中,通过makefile文件来描述源程序之间的相互关系并自动维护编译工作makefile是一个文本形式的数据库文件包含一些规则告诉make做什么、怎么做和在什么条件做GNUmake被调用后顺序查找名为GNUmakefile、makefile或Makefile(习惯上用得最多)的文件不仅可以用于编译,而且可以用于安装、删除等等也可以指定其他文件起到makefile的作用,2020/5/22,Linux及编程,27,GNUmake管理项目,makefile文件有一些规则组成规则Rule规则的组成Target:make最终需要创建的东西Dependencylist:编译目标需要的其他文件Commandlist:从依赖体创建出目标体所需执行的命令列表Target通常都是程序,但也可是文本文件、手册页等Command可以是编译命令,也可以是shell命令语法:target:dependencydependencycommand,2020/5/22,Linux及编程,28,GNUmake管理项目,例子/*helper.h-Headerforhelper.c*/voidmsg(void);/*helper.c-Helpercodeforhowdy.c*/#include#includehelper.hvoidmsg(void)printf(ThismessagesentfromJupiter.n);,2020/5/22,Linux及编程,29,GNUmake管理项目,例子/*hello.c-CanonicalHello,World!program*/#include#includehelper.hintmain(void)printf(Hello,Linuxprogrammingworld!n);msg();return0;,2020/5/22,Linux及编程,30,GNUmake管理项目,例子#SampleMakefileformakehowdy:howdy.ohelper.ohelper.hgcchowdy.ohelper.o-ohowdyhelper.o:helper.chelper.hgcc-chelper.chowdy.o:howdy.cgcc-chowdy.chello:hello.cgcchello.c-ohelloall:howdyhelloclean:rmhowdyhello*.o,默认目标体,make要创建的文件,三个依赖体,命令,避免编译器调用未声明的函数产生出错信息,怎样生成单个目标,笼统规则,伪目标,没有依赖体,因此认为目标体是最新的,不会被自动执行,注释,2020/5/22,Linux及编程,31,GNUmake管理项目,例子,笼统规则,判断无修改,无依赖体,2020/5/22,Linux及编程,32,GNUmake管理项目,例子,生成单个目标,生成单个目标,生成单个目标,生成多个目标,2020/5/22,Linux及编程,33,GNUmake管理项目,例子#Sample2Makefileformakehowdy:howdy.ohelper.ohelper.hgcchowdy.ohelper.o-ohowdyhelper.o:helper.chelper.hgcc-chelper.chowdy.o:howdy.cgcc-chowdy.chello:hello.cgcchello.c-ohelloall:howdyhello.PHONY:cleanclean:rmhowdyhello*.o,不检查是否存在有文件名和依赖体中的一个名字相匹配的文件,而是直接执行与之相关的命令。,2020/5/22,Linux及编程,34,GNUmake管理项目,例子,检查到存在有文件名和目标体的名字相匹配的文件,又无依赖体,故不执行与之相关的命令。,修改Makefile如前slide。,不检查是否存在有文件名和依赖体中的一个名字相匹配的文件,而是直接执行与之相关的命令。,2020/5/22,Linux及编程,35,GNUmake管理项目,例子,2020/5/22,Linux及编程,36,GNUmake管理项目,为了简化编辑和维护,允许在makefile创建和使用变量变量一个名字(像是C语言中的宏),代表一个文本字符串(变量的值)。引用变量的地方,变量会被它的值所取代严格的文本替换变量名是不包括“:”、“#”、“=”、前置空白和尾空白的任何字符串变量名大小写敏感定义VARNAME=some_text引用$(VARNAME),2020/5/22,Linux及编程,37,GNUmake管理项目,变量使用例子1objects=program.ofoo.outils.oprogram:$(objects)cc-oprogram$(objects)$(objects):defs.h变量使用例子2foo=cprog.o:prog.$(foo)$(foo)$(foo)-$(foo)prog.$(foo),2020/5/22,Linux及编程,38,GNUmake管理项目,两种变量定义递归展开变量#Makefile3foo=$(bar)bar=$(ugh)ugh=Huh?all:;echo$(foo)简单展开变量x:=fooy:=$(x)barx:=later就等价于:y:=foobarx:=later,2020/5/22,Linux及编程,39,GNUmake管理项目,自动变量Make自动用特定的、熟知的值替换$表示规则的目标文件名。$%当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。如果目标不是静态库文件,其值为空。$规则的第一个依赖文件名。$?所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成员(.o文件)。$规则的所有依赖文件列表,使用空格分隔。$+类似“$”,但是它保留了依赖文件中重复出现的文件。$(D)表示目标文件的目录部分(不包括斜杠)。$(F)目标文件的完整文件名中除目录以外的部分(实际文件名)。,2020/5/22,Linux及编程,40,GNUmake管理项目,隐含(预定义)变量用于定义程序名或给这些程序传递标志和参数AR函数库打包程序,可创建静态库.a文档。默认是“ar”。AS汇编程序。默认是“as”。CCC编译程序。默认是“cc”。CXXC+编译程序。默认是“g+”。CPPC程序的预处理器(输出是标准输出设备)。默认是“$(CC)-E”。RM删除命令。默认是“rm-f”ARFLAGS执行“AR”命令的命令行参数。默认值是“rv”。ASFLAGS执行汇编语器“AS”的命令行参数(明确指定“.s”或“.S”文件时)CFLAGS执行“CC”编译器的命令行参数(编译.c源文件的选项)。CXXFLAGS执行“g+”编译器的命令行参数(编译.cc源文件的选项)。CPPFLAGS执行C预处理器“cc-E”的命令行参数(C和Fortran编译器会用到)。LDFLAGS链接器(如:“ld”)参数。,2020/5/22,Linux及编程,41,GNUmake管理项目,隐式(预定义)规则为make提供了重建一类目标文件通用方法,不需要在Makefile中明确地给出重建特定目标文件所需要的细节描述。make对C文件的编译过程是由.c源文件编译生成.o目标文件。当Makefile中出现一个.o文件目标时,make会使用这个通用的方式将后缀为.c的文件编译称为目标的.o文件。E.g.OBJS=editor.oscreen.okeyboard.oeditor:$(OBJS)ccoeditor$(OBJS).PHONY:cleanclean:rmeditor$(OBJS)只要目标文件名中除后缀以外其它部分相同,make都能够使用若干个隐含规则来最终产生这个目标文件(当然最原始的那个文件必须存在)。E.g.可以在Makefile中这样来实现一个规则:“foo:foo.h”,只要在当前目录下存在“foo.c”这个文件,就可以生成“foo”可执行文件。,2020/5/22,Linux及编程,42,GNUmake管理项目,模式规则在模式规则中,目标文件是一个带有模式字符“%”的文件,使用模式来匹配目标文件。文件名中的模式字符“%”可以匹配任何非空字符串,除模式字符以外的部分要求一致。例如:“%.c”匹配所有以“.c”结尾的文件(匹配的文件名长度最少为3个字母。E.g.%.o:%.c$(CC)-c$(CFLAGS)$(CPPFLAGS)$-o$此规则描述了一个.o文件如何由对应的.c文件创建。规则的命令行中使用了自动化变量“$”和“$”,其中自动化变量“$”代表规则的依赖体,“$”代表规则的目标。此规则在执行时,命令行中的自动化变量将根据实际的目标和依赖文件取对应值。,2020/5/22,Linux及编程,43,GNUmake管理项目,make出错信息FOOErrorNNFOOsignaldescription这类错误并不是make的真正错误。它表示make检测到make所调用的作为执行命令的程序返回一个非零状态missingseparator.Stop.missingseparator(didyoumeanTABinsteadof8spaces?).Stop.不可识别的命令行,make在读取Makefile过程中不能解析其中包含的内容。commandscommencebeforefirsttarget.Stop.missingrulebeforecommands.Stop.Makefile可能是以命令行开始:以Tab字符开始,但不是一个合法的命令行(例如,一个变量的赋值)。命令行必须和规则一一对应。NoruletomaketargetXXX.NoruletomaketargetXXX,neededbyyyy.无法为重建目标“XXX”找到合适的规则,包括明确规则和隐含规则。,2020/5/22,Linux及编程,44,GNUmake管理项目,make出错信息Notargetsspecifiedandnomakefilefound.Stop.Notargets.Stop.第一个错误表示在命令行中没有指定需要重建的目标,并且make不能读入任何makefile文件。第二个错误表示能够找到makefile文件,但没有终极目标或者没有在命令行中指出需要重建的目标。这种情况下,make什么也不做。MakefileXXXwasnotfound.IncludedmakefileXXXwasnotfound.没有使用“-f”指定makefile文件,make不能在当前目录下找到默认Makefile。warning:overridingcommandsfortargetXXXwarning:ignoringoldcommandsfortargetXXX对同一目标“XXX”存在一个以上的重建命令。GNUmake规定:当同一个文件作为多个规则的目标时,只能有一个规则定义重建它的命令(双冒号规则除外)。如果为一个目标多次指定了相同或者不同的命令,就会产生第一个告警;第二个告警信息说新指定的命令覆盖了上一次指定的命令。CircularXXX-YYYdependencydropped.规则的依赖关系产生了循环:目标“XXX”的依赖文件为“YYY”,而依赖“YYY”的依赖列表中又包含“XXX”。,2020/5/22,Linux及编程,45,GNUmake管理项目,make出错信息RecursivevariableXXXreferencesitself(eventually).Stop.make的变量“XXX”(递归展开式)在替换展开时,引用它自身。Unterminatedvariablereference.Stop.变量或者函数引用语法不正确,没有使用完整的的括号(缺少左括号或者右括号)。targetisuptodate指定target的相关文件没有变化,2020/5/22,Linux及编程,46,GDB调试,使用GDB调试的“前奏”为使用GDB调试,应使用-g或-ggdb选项进行编译,以生成增强的符号表即$gccgfile1.cfile2.copr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 翠屏公安招聘警务辅助人员笔试真题2024
- 石大学前儿童保育学课件1-5泌尿系统
- 无人化操作下的安全监控策略-洞察阐释
- 生理学教育领域面临的挑战与AI解决方案
- 家庭托育点的运营模式与管理标准化探索
- 云边协同下嵌入式AI与物联网教学系统设计
- 政法队伍管理与监督机制的创新与完善
- 校企合作中的资源共享与利益共赢机制
- 2025至2030年中国电动升降机遥控器行业投资前景及策略咨询报告
- 2025至2030年中国玻璃盘下水行业投资前景及策略咨询报告
- 水系统中央空调项目可行性研究报告
- JG/T 504-2016陶粒加气混凝土砌块
- 2025年中考数学压轴题专练:圆的各性质的综合题(原卷版+解析)
- 生猪养殖绿色转型与低碳技术应用
- 2025工贸安全考试题库及答案
- 2025-2030中国保险中介机构行业市场发展现状及竞争格局与投资前景研究报告
- 内在动机:自主掌控人生的力量
- 人教版八年级物理(下册)期末考试题及答案
- 2025年4月自考00186国际商务谈判试题及答案含评分标准
- 2025年教育管理专业考研试题及答案
- 山东省济南市2025届高三三模生物试卷(含答案)
评论
0/150
提交评论