




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8讲 GNU C 开发工具链1 GNU开发工具简介nGNU开发工具n自由软件n完备的工具链: GCC、binutils、gdb、GNU make、patch、CVS 、开发库n命令行方式:使用稍复杂、功能强大n下载: GNU Tools开发工具组成nGNU Tools是linux环境下最主要的开发工具集,主要有以下几个部分:n编译开发工具:把源程序编译为可执行文件,如gcc。n调试工具:对执行程序进行源码或汇编级调试的软件,如gdb。n软件工程工具:用于协助多人开发或大型软件项目的管理的软件,如make、cvs等。GCC(GNU Compiler Collection)
2、n支持C、C+、ADA、Object C、Java、Fortran、PASCAL等语言。n主要包括:ncpp:GNU C编译器的预处理器。ngcc:符合ISO标准的C编译器。ng+:基本符合ISO标准的C+编译器。ngcj:GCC的java前端。ngnat:GCC的GNU ADA 95的前端。binutilsn是一组二进制工具程序集合,是辅助GCC的主要软件。n主要包括:nas:GNU汇编器nld:GNU链接器nar:创建归档文件,向库中添加/提取obj文件nnm:列出obj文件中的符号nobjcopy:复制和转化obj文件binutilsnobjdump:显示对象文件的信息nranlib:根
3、据归档文件中内容建立索引nreadelf:显示elf格式执行文件中的各种信息nsize:显示object文件和执行文件各段的总大小nstrings:显示文件中可以打印的字符nstrip:去掉执行文件中多余的信息(如调试信息)ngprof:用来显示图表档案数据GNU开发工具的使用2 GCC 的使用n基本语法 gcc options filenamesn说明:n在gcc后面可以有多个编译选项,同时进行多个编译操作。很多的gcc选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符。例如,下面的两个命令是不同的: gcc -p -g test1.c gcc -pg 当你不用任何选项编译一个程序
4、时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。 gcc选项n-o选项 你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。 例:gcc o count -c选项:告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤。这个选项使用的非常频繁,因为它使得编译多个C程序时速度更快并且更易于管理。缺省时GCC建立的目标代码文件有一个.o的扩展名。 例:gcc c test2.cgcc选项n-E 只运行 C 预编译器。 n-S 编译选项告诉 gcc 在为 C 代码产生了汇编语言文件后停止编译。n-shared 生成共享目标文件。通常用在建立共享库时。 n
5、-static 禁止使用共享连接。 n警告选项:警告选项:n在在gccgcc中用开关中用开关-Wall-Wall控制警告信息,使用示例命令如下:控制警告信息,使用示例命令如下: gcc gcc Wall -o test3_1 test3_1.cWall -o test3_1 test3_-w -w 不生成任何警告信息。不生成任何警告信息。查找选项ngcc一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。n-I选项:指定头文件的搜索目录例:gcc I/export/home/st o test1 -L选项:指定库文件的搜索目录例:gcc
6、 L/usr/X11/R6/lib o test1 test1.c多个源文件生成一个可执行文件 问题:有多个源文件时,如何生成一个可执行文件?n方法1:gcc Wall o mytest test1.c test2.c 方法2:gcc-Wall -c test1.cgcc-Wall c test2.cgcc-Wall c test3.c gcc o mytest test1.o test2.o test3.o优化选项 n优化选项可以使GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。n-O0 不进行优化处理。n-O选项:告诉GCC对源
7、代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。n-O2选项:告诉GCC 产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快。n-O3选项:比 -O2 更进一步优化,包括 inline 函数。 版本选项n-v选项n用户将会得到自己目前正在使用的gcc的版本及与版本相关的一些信息。 gcc -v 将得到如下结果: Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2n-V 选项n如果安装了多个版本的gcc,并且想强制执行其中的
8、某个版本,可以用命令通知系统用户要使用的版本。 gcc -V2.6.3 -v宏定义选项n-D MACRO以字符串“1”定义 MACRO 宏。 n-D MACRO=DEFN以字符串“DEFN”定义 MACRO 宏。 n-U MACRO取消对 MACRO 宏的定义。 调试和剖析选项 n使用调试选项后,gcc在进行编译的时候,在目标文件(.o)和创建的可执行文件中插入额外信息,这些额外信息使gdb能够判断编译过的代码和源代码之间的关系。n-g选项:告诉GCC产生能被 GNU 调试器使用的调试信息以便调试你的程序。例:gcc g o test3 -pg选项:告诉GCC在你的程序里加入额外的代码,执行时
9、,产生gprof用的剖析信息以显示你的程序的耗时情况。n使用gdb调试工具,命令行如下: 例:gcc ggdb3 o test3 test3.c 3 调试工具gdbnGDB调试器简介 ngdb 的常用命令ngdb应用实例 gdb 简介nLinux系统中包含了GNU 调试程序gdb,它是一个用来调试C和 C+ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。ngdb 所提供的一些功能如下所示:n运行程序,设置所有的能影响程序运行的参数和环境;n控制程序在指定的条件下停止运行; n当程序停止时,可以检查程序的状态;n修改程序的错误,并重新运行程序; n动态监视程序中变
10、量的值; n可以单步逐行执行代码,观察程序的运行状态。n分析崩溃程序的产生的core文件gdb的特点ngdb的功能非常强大n到目前为止,gdb已能够支持Moduls-2、Chill、Pascal和FORTRAN程序的调试,但是调试这些语言的源程序时有一些功能还不能使用。n例如调试FORTRAN程序时还不支持表达式的输入、输出变量或类FORTRAN的词法。 ngdb程序调试的对象是可执行文件,而不是程序的源代码文件。n然而,并不是所有的可执行文件都可以用gdb调试。如果要让产生的可执行文件可以用来调试,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。n调试信息包含程序里
11、的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。ngdb 利用这些信息使源代码和机器码相关联。 gdb是一个用来调试C和C+程序的常用调试工具之一。 Gdb的帮助n在 gdb 提示符处键入help,将列出命令的分类,主要的分类有: naliases:命令别名 nbreakpoints:断点定义; ndata:数据查看; nfiles:指定并查看文件; nrunning:程序执行; nstack:调用栈查看; nstatu:状态查看; ntracepoints:跟踪程序执行。 n后跟命令的分类名,可获得该类命令的详细清单 基本gdb命令(1/2)nfile命令:装入想要调试的可执行文
12、件。 ncd命令:改变工作目录。 npwd命令:返回当前工作目录。 nrun命令:执行当前被调试的程序。 nkill命令:停止正在调试的应用程序。 nlist命令:列出正在调试的应用程序的源代码。 nbreak命令:设置断点。 nwatch命令:设置监视点,监视表达式的变化。 nnext命令:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经run,开始了代码的执行。基本gdb命令(2/2)nstep命令:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。
13、 ndisplay命令:在应用程序每次停止运行时显示表达式的值。ninfo break命令:显示当前断点列表,包括每个断点到达的次数ninfo files命令:显示调试文件的信息。 ninfo func命令:显示所有的函数名。 nprint命令;显示表达式的值。 ndelete命令:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。 nShell命令:执行Linux Shell命令。 nmake命令:不退出gdb而重新编译生成可执行文件。 nQuit命令:退出gdb。 4 GNU make和makefile nGNU make概述nMakefile 的基本结构nMakef
14、ile中的变量nGNU make 的主要预定义变量nMakefile的隐含规则 nmake命令行选项 GNU make概述n在开发项目中,通常利用 make 工具来自动完成编译工作。这些工作包括:利用这种自动编译可大大简化开发工作,避免不必要的重新编译。 nmake 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。 当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。 n默认情况下,GNU make 工具在当前工
15、作目录按如下顺序搜索 makefile: n GNUmakefile n makefile n Makefile makefile举例nLinux程序员使用第三种文件名Makefile。因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。 n如果要使用其他文件作为 makefile,则可利用类 似下面的 make 命令选项指定 makefile 文件: $ make -f Makefile.debug n例1:一个简单的makefile prog:prog1.o prog2.o gcc prog1.o prog2.o -o prog prog1.o:prog1.c lib.h gcc
16、-c -I. -o prog1.o prog1.c prog2.o:prog2.c gcc -c prog2.c Makefile 的基本结构(1/2)nMakefile是一个文本形式的数据库文件,其中包含一些规则来告诉make处理哪些文件以及如何处理这些文件。n规则主要是描述哪些文件(称为target目标文件,不要和编译时产生的目标文件相混淆)是从哪些别的文件(称为dependency依赖文件)中产生的,以及用什么命令(command)来执行这个过程。n依靠这些信息,make会对磁盘上的文件进行检查,如果目标文件的生成或被改动时的时间(称为该文件时间戳)至少比它的一个依赖文件还旧的话,mak
17、e就执行相应的命令,以更新目标文件。n目标文件不一定是最后的可执行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。Makefile 的基本结构(2/2)nMakefile规则的一般形式如下:target:dependency dependency(tab) n一个Makefile文件主要含有一系列的规则,每条规则包含以下内容。n一个目标(target),即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。n一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件。n一系列命今(command),是make执行
18、的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。n除非特别指定,否则make的工作目录就是当前目录。target是需要创建的二进制文件或目标文件,dependency是在创建target时需要用到的一个或多个文件的列表,命令序列是创建target文件所需要执行的步骤,比如编译命令。 Makefile实例(1/4)# 以#开头的为注释行 test:prog.o code.ogcc o test prog.o code.o prog.o:prog.c prog.h code.hgcc c prog.c o prog.o code.o:
19、code.c code.hgcc c code.c o code.o clean:rm f *.o n上面的Makefile文件中共定义了四个目标:test、prog.o、code.o和clean。n目标从每行的最左边开始写,后面跟一个冒号(:),如果有与这个目标有依赖性的其他目标或文件,把它们列在冒号后面,并以空格隔开。然后另起一行开始写实现这个目标的一组命令。n在Makefile中,可使用续行号()将一个单独的命令行延续成几行。但要注意在续行号()后面不能跟任何字符(包括空格和键)Makefile实例(2/4)n一般情况下,调用make命令可输入:n# make targetntarget
20、是Makefile文件中定义的目标之一,如果省略target,make就将生成Makefile文件中定义的第一个目标。n对于上面Makefile的例子,单独的一个“make”命令等价于:n# make testMakefile实例(3/4)n因为test是Makefile文件中定义的第一个目标,make首先将其读入,然后从第一行开始执行,把第一个目标test作为它的最终目标,所有后面的目标的更新都会影响到test的更新。n第一条规则说明只要文件test的时间戳比文件prog.o或code.o中的任何一个旧,下一行的编译命令将会被执行。 n但是,在检查文件prog.o和code.o的时间戳之前,
21、make会在下面的行中寻找以prog.o和code.o为目标的规则,在第三行中找到了关于prog.o的规则,该文件的依赖文件是prog.c、prog.h和code.h。同样,make会在后面的规则行中继续查找这些依赖文件的规则,如果找不到,则开始检查这些依赖文件的时间戳,如果这些文件中任何一个的时间戳比prog.o的新,make将执行“gcc c prog.c o prog.o”命令,更新prog.o文件。Makefile实例(4/4)n以同样的方法,接下来对文件code.o做类似的检查,依赖文件是code.c和code.h。当make执行完所有这些套嵌的规则后,make将处理最顶层的test
22、规则。如果关于prog.o和code.o的两个规则中的任何一个被执行,至少其中一个.o目标文件就会比test新,那么就要执行test规则中的命令,因此make去执行gcc命令将prog.o和code.o连接成目标文件test。n在上面Makefile的例子中,还定义了一个目标clean,它是Makefile中常用的一种专用目标,即删除所有的目标模块make的工作过程n现在来看一下make做的工作:n首先make按顺序读取makefile中的规则,n然后检查该规则中的依赖文件与目标文件的时间戳哪个更新通过以上的分析过程,可以看到make的优点,因为.o目标文件依赖.c源文件,源码文件里一个简单改
23、变都会造成那个文件被重新编译,并根据规则链依次由下到上执行编译过程,直到最终的可执行文件被重新连接。n例如,当改变一个头文件的时候,由于所有的依赖关系都在Makefile里,因此不再需要记住依赖此头文件的所有源码文件,make可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接Makefile中的变量nMakefile里的变量就像一个环境变量。事实上,环境变量在make中也被解释成make的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量,变量的主要作用如下: n保存文件名列表。n保存可执行命令名,如编译器。n保存编译器的参数。变
24、量的定义和使用nMakefile中的变量是用一个文本串在Makefile中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:VARNAME=stringn使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值: $VARNAME nmake解释规则时,VARNAME在等式右端展开为定义它的字符串。n变量一般都在Makefile的头部定义。按照惯例,所有的Makefile变量都应该是大写。如果变量的值发生变化,就只需要在一个地方修改,从而简化了Makefile的维护。 Makefile变量举
25、例n现在利用变量把前面的Makefile重写一遍:OBJS=prog.o code.oCC=gcc test:$ OBJS $ CC o test $ OBJS prog.o:prog.c prog.h code.h$ CC c prog.c o prog.o code.o:code.c code.h$ CC c code.c o code.o clean:rm f *.o 变量的类型n除用户自定义的变量外,make还允许使用n环境变量n使用环境变量的方法很简单,在make启动时,make读取系统当前已定义的环境变量,并且创建与之同名同值的变量,因此用户可以像在shell中一样在Makefil
26、e中方便的引用环境变量。n需要注意的是,如果用户在Makefile中定义了同名的变量,用户自定义变量将覆盖同名的环境变量n自动变量n预定义变量GNU make 的主要自动变量n$* 不包含扩展名的目标文件名称。 n$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。n$ 第一个依赖文件的名称。 n$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。n$ 目标的完整名称。 n$ 所有的依赖文件,以空格分开,不包含重复的依赖文件。 n$% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称 为 mytarget.so(image
27、.o),则 $ 为 mytarget.so,而 $% 为 image.o。 GNU make 的主要预定义变量nAR 归档维护程序的名称,默认值为 ar。 nARFLAGS 归档维护程序的选项。 nAS 汇编程序的名称,默认值为 as。 nASFLAGS 汇编程序的选项。 nCCC 编译器的名称,默认值为 cc。 nCFLAGSC 编译器的选项。 nCPPC 预编译器的名称,默认值为 $(CC) -E。 nCPPFLAGSC 预编译的选项。nCXXC+ 编译器的名称,默认值为 g+。 nCXXFLAGSC+ 编译器的选项。 nFCFORTRAN 编译器的名称,默认值为 f77。 nFFLAGSFORTRAN 编译器的选项。Makefile的隐含规则 n在上面的例子中,几个产生目标文件的命令都是从“.c”的C语言源文件和相关文件通过编译产生“.o”目标文件,这也是一般的步骤。实际上,make可以使工作更加自动化,也就是说,make知道一些默认的动作,它有一些称作隐含规则的内置的规则,这些规则告诉make当用户没有完整地给出某些命令的时候,应该怎样执行。Makefile的隐含规则n例如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CGCC 29-2019微商运营从业人员技术条件
- T/CECS 10237-2022绿色建材评价供暖空调输配系统用风机、风管、水泵
- T/CECS 10037-2019绿色建材评价卫生洁具
- T/CCSAS 048-2023危险化学品电子标签选型技术规范
- T/CCSAS 044-2023化工过程本质安全化评估指南
- T/CCOA 33-2020平房仓气密改造操作规范
- T/CCOA 13-2020稻壳活性炭
- T/CCIA 0016-2023无缝贴花装饰瓷器
- T/CCAAS 006-2022高速公路收费微笑服务标准
- T/CAQI 091-2019食用豌豆蛋白
- 《“珍牡肾骨胶囊”对维持性血透患者钙磷代谢紊乱的影响》
- 【MOOC】金融法学-浙江财经大学 中国大学慕课MOOC答案
- 道路施工交通分流方案终版
- GB/T 44902-2024木工机床安全共同性要求
- 24秋国家开放大学《科学与技术》终结性考核大作业参考答案
- 商务谈判经典案例全案(56个案例)
- 《环境影响评价》全套教学课件
- 《公路桥涵施工技术规范》JTG-T3650-2020培训
- 2024年天津市单位职工劳动合同(三篇)
- 2024秋期国家开放大学专科《液压与气压传动》一平台在线形考(形考任务+实验报告)试题及答案
- 胆石症病人的护理
评论
0/150
提交评论