版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章Linux中的C语言编程
5.1Linux系统的C编译器:GCC
5.2Linux系统的调试器:GDB
5.3Linux系统的C项目管理器:make。
GNU是GNU’sNotUnix的递归缩写。5.1GCC
GCC(GNUCompilerCollection)GNU编译器家族。它能够完成对多种编程语言的编译,包括C、C++、Ada、ObjectC、Java、Fortran等。
GCC具有交叉编译的功能。交叉是指在一种平台上生成在另一种平台上运行的可执行程序。5.1.1gcc介绍
使用GCC产生的可执行代码的执行效率要比其他编译器所产生的可执行代码的执行效率平均高20%~30%。gcc可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理在Linux中一般不通过文件名的后缀来区分文件,但GCC通过文件的后缀来区分文件。文件名后缀文件类型.c
C语言源程序文件.a由目标文件构成的档案库文件.h头文件.i已经预处理过的C源程序文件.C或.cc或.cxx
C++源程序文件.ii已经预处理过的C++源程序文件.o编译后的目标文件.s汇编语言源程序文件.m
ObjectC源程序文件.S已经预处理过的汇编语言源程序文件基本语法
gcc[options][filenames]说明:在gcc后面可以有多个编译选项,同时进行多个编译操作。很多的gcc选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符。例如,下面的两个命令是不同的:
gcc-p-gtest1.c
gcc-pgtest1.c当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。5.1.2gcc的使用-o选项你能用-o编译选项来为将产生的可执行文件指定一个文件名来代替a.out。
例:gcc–ocountcount.c-c选项:告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤。这个选项使用的非常频繁,因为它使得编译多个C程序时速度更快并且更易于管理。 例:gcc–ctest2.c-E只运行C预编译器。结果打印到标准输出。-S编译选项告诉gcc
在为C代码产生了汇编语言文件后停止编译。-shared生成共享目标文件。通常用在建立共享库时。-static禁止使用共享连接。在gcc中用开关-Wall控制警告信息,使用示例命令如下:
gcc–Wall-otest3_1test3_1.c-w不生成任何警告信息。
显示警告信息
gcc一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。-Idirname选项:指定头文件的搜索目录 例:
gcc–I/export/home/st–otest1test1.c-Ldirname选项:指定库文件的搜索目录 例:
gcc–L/usr/X11/R6/lib–otest1test1.c -lname选项:指定库文件 例:
gcc–opthread
pthread.c–lpthread指定头文件目录、库文件目录和库文件
多个源文件生成一个可执行文件
问题:有多个源文件时,如何生成一个可执行文件?方法1:gcc–Wall–omytesttest1.ctest2.ctest3.c方法2:gcc-Wall-ctest1.cgcc-Wall–ctest2.cgcc-Wall–ctest3.cgcc-omytesttest1.otest2.otest3.o优化选项
优化选项可以使GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。-O0不进行优化处理。-O选项:告诉GCC对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2选项:告诉GCC产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快且占用更少的内存。-O3选项:比-O2更进一步优化,包括
inline函数。版本选项-v选项用户将会得到自己目前正在使用的gcc的版本及与版本相关的一些信息。
gcc-v将得到如下结果:
Readingspecsfrom/usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gccversion2.7.2-V选项如果安装了多个版本的gcc,并且想强制执行其中的某个版本,可以用命令通知系统用户要使用的版本。
gcc-V2.6.3-v调试和剖析选项
使用调试选项后,gcc在进行编译的时候,在目标文件(.o)和创建的可执行文件中插入额外信息,这些额外信息使gdb能够判断编译过的代码和源代码之间的关系。-g选项:告诉GCC产生能被GNU调试器使用的调试信息以便调试你的程序。 例:gcc–g–otest3test3.c-pg选项:告诉GCC在你的程序里加入额外的代码,执行时,产生gprof用的剖析信息以显示你的程序的耗时情况。5.2GDBGDB介绍GDB的使用GDB的使用举例5.2.1gdb
介绍Linux系统中包含了GNU调试程序gdb,它是一个用来调试C和C++程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。gdb
所提供的一些功能如下所示:运行程序,设置所有的能影响程序运行的参数和环境;控制程序在指定的条件下停止运行;当程序停止时,可以检查程序的状态;修改程序的错误,并重新运行程序;动态监视程序中变量的值;可以单步逐行执行代码,观察程序的运行状态。分析崩溃程序产生的core文件gdb的特点gdb的功能非常强大到目前为止,gdb已能够支持Moduls-2、Chill、Pascal和FORTRAN程序的调试,但是调试这些语言的源程序时有一些功能还不能使用。例如调试FORTRAN程序时还不支持表达式的输入、输出变量或类FORTRAN的词法。gdb程序调试的对象是可执行文件,而不是程序的源代码文件。然而,并不是所有的可执行文件都可以用gdb调试。如果要让产生的可执行文件可以用来调试,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb
利用这些信息使源代码和机器码相关联。gdb是一个用来调试C和C++程序的常用调试工具之一。5.2.2gdb的使用启动GDB的方法是在Linux命令窗口中执行命令:[root@Linux~]#gdb
可执行文件名进入GDB界面后,可以使用下列GDB常用命令:setarg:给当前要运行的程序传递参数,参数跟在其后。showargs:显示当前程序参数。list或l:列出正在调试的应用程序的源代码。break或b:设置断点。后跟断点所在行号或函数名。infobreak或ibreak:显示当前断点列表,包括每个断点到达的次数delete:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。clear:删除指定断点。后跟断点所在的行号或函数名。不指定参数则删除该命令执行之前创建的断点。disable:使指定断点失效。后跟断点编号,不指定编号则使所有断点失效。enable:使指定断点生效。后跟断点编号,不指定编号则使所有断点生效。run或r:从头执行当前被调试的程序,直到结束或有效断点。continue或c:继续执行当前被调试的程序,直到结束或有效断点。next:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经run,开始了代码的执行。step:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。finish:结束当前函数的执行,并显示函数的返回值。call:调用执行指定的函数,后跟函数名。setvariable:给指定变量赋值。print或p:显示指定变量的值或函数调用结果的值。whatis:显示指定变量的类型。ptype:显示指定变量的类型,可以显示结构体的定义。bt:查看函数调用关系。quit或q:退出GDB。回车键:继续执行上条命令。Gdb的帮助在gdb
提示符处键入help,将列出命令的分类,主要的分类有:aliases:命令别名breakpoints:断点定义;data:数据查看;files:指定并查看文件;internals:维护命令;running:程序执行;stack:调用栈查看;statu:状态查看;tracepoints:跟踪程序执行。后跟命令的分类名,可获得该类命令的详细清单5.2.3gdb的使用举例1 #inclue<stdio.h>int
factorrial(inth){
int
k,s=1;
for(k=1;k<=h;k++){s=s*k;}returns;}
intmain(){
intsun=0,x;
for(x=6;x<=10;x++){sum=sum+factorial(x);}
printf(“sum=%d”,sum);return0;}[root@linux
zhu]vi
gdbtest.c运行GDB调试命令
gdb
gdbtest运行GDB调试命令
运行GDB调试命令help
5.3make工具5.3.1make工具介绍5.3.2Makefile
文件5.3.3make使用举例5.3.1make工具介绍在开发项目中,通常利用make工具来自动完成编译工作。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。make工具通过一个称为makefile
的文件来完成并自动维护编译工作。makefile
需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。默认情况下,GNUmake工具在当前工作目录按如下顺序搜索makefile:
GNUmakefile(不推荐使用)
makefile
Makefile
(推荐使用)如不使用预设文件名,则需要在执行make时加-f参数指明。5.3.2makefile文件
Makefile文件中的语句语法是shell语句语法的子集,以“#”开头的语句为注释语句。
Makefile文件一般分为两个部分。前置部分和规则部分。前置部分由include和变量定义语句构成。规则部分由各种规则描述的语句块构成,make执行时将根据这些语句块的描述执行相应的命令或者程序。规则部分格式:
TARGET:PREREQISITES COMMAND
TARGET为规则的目标。可以是生成目标或伪目标。
PREREQISITES为规则的依赖,表示要生成目标的先决条件为这些目标所依赖的文件必须先生成,多个依赖文件时用空格分隔。“伪目标”一般没有依赖文件
COMMAND为规则要执行的命令,可以是任何shell命令或可在shell下执行的程序,表示make执行这条规则时所需要执行的动作。一个规则可以有多个命令行,每一个命令独占一行,以[Tab]键开始。生成目标可以有多个,之间用空格分隔。伪目标是make执行的动作名称,不生成文件,而只执行相应的命令。
makefile最终目标规则描述语句块在最前面,其后是以最终目标的依赖为目标的规则语句块。以此类推,直到依赖源程序的规则语句块。make的工作过程现在来看一下make做的工作:首先make按顺序读取makefile中的规则,然后检查该规则中的依赖文件与目标文件的时间戳哪个更新通过以上的分析过程,可以看到make的优点,因为.o目标文件依赖.c源文件,源码文件里一个简单改变都会造成那个文件被重新编译,并根据规则链依次由下到上执行编译过程,直到最终的可执行文件被重新连接。例如,当改变一个头文件的时候,由于所有的依赖关系都在Makefile里,因此不再需要记住依赖此头文件的所有源码文件,make可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接makefile举例Linux程序员推荐使用第三种文件名Makefile。因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。如果要使用其他文件作为makefile,则可利用类似下面的make命令选项指定makefile
文件:
$make-fMakefile.debug
例1:一个简单的makefile
test:prog1.oprog2.o
gccprog1.oprog2.o-oprog
prog1.o:prog1.clib.h
gcc-c-I.-oprog1.oprog1.c
prog2.o:prog2.c
gcc-cprog2.cMakefile的内容详解显式规则:目标,依赖,命令。隐含规则:由于make有自动推导功能,因此隐含规则可以让用户比较简略地书写Makefile。变量定义:在Makefile中要定义一系列的变量,如同C中的宏,执行时变量会被扩展到相应的引用位置上。文件指示:1、像C的include;2、像C的#if;3、可以定义一个多行命令。注释:行注释,以#打头。Makefile
显式规则(1/2)Makefile是一个文本形式的数据库文件,其中包含一些规则来告诉make处理哪些文件以及如何处理这些文件。规则主要是描述哪些文件(称为target目标文件,不要和编译时产生的目标文件OBJ相混淆)是从哪些别的文件(称为dependency依赖文件)中产生的,以及用什么命令(command)来执行这个过程。依靠这些信息,make会对磁盘上的文件进行检查,如果目标文件的生成或被改动时的时间(称为该文件时间戳)至少比它的一个依赖文件还旧的话,make就执行相应的命令,以更新目标文件。目标文件不一定是最后的可执行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。Makefile显式规则(2/2)Makefile规则的一般形式如下:
TARGET:PREREQUISTES (tab)COMMAND一个Makefile文件主要含有一系列的规则,每条规则包含以下内容。一个目标(target),即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。一个或多个依赖文件(prerequistes)列表,通常是编译目标文件所需要的其他文件。一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。除非特别指定,否则make的工作目录就是当前目录。target是需要创建的二进制文件或目标文件,prerequistes是在创建target时需要用到的一个或多个文件的列表,命令序列是创建target文件所需要执行的步骤,比如编译命令。Makefile中的变量Makefile里的变量就像一个环境变量。事实上,环境变量在make中也被解释成make的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量,变量的主要作用如下:保存文件名列表。保存可执行命令名,如编译器。保存编译器的参数。变量的定义和使用Makefile中的变量是用一个文本串在Makefile中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“=”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:
VARNAME=string使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值:
$(VARNAME)或${VARNAME}make解释规则时,VARNAME位置展开为定义它的字符串。变量一般都在Makefile的头部定义。按照惯例,所有的Makefile变量都应该是大写。如果变量的值发生变化,就只需要在一个地方修改,从而简化了Makefile的维护。Makefile变量举例一个简单的Makefile例子:OBJS=prog.ocode.oCC=gcc
test:${OBJS} ${CC}–otest${OBJS}
prog.o:prog.c
prog.hcode.h ${CC}–cprog.c–oprog.o
code.o:code.ccode.h ${CC}–ccode.c–ocode.o
clean:
rm–f*.o变量的类型除用户自定义的变量外,make还允许使用环境变量使用环境变量的方法很简单,在make启动时,make读取系统当前已定义的环境变量,并且创建与之同名同值的变量,因此用户可以像在shell中一样在Makefile中方便的引用环境变量。需要注意的是,如果用户在Makefile中定义了同名的变量,用户自定义变量将覆盖同名的环境变量自动变量预定义变量GNUmake的主要预定义变量$*不包含扩展名的目标文件名称。$@目标的完整名称。$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$<第一个依赖文件的名称。$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。$^所有的依赖文件,以空格分开,不包含重复的依赖文件。$%如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为mytarget.so(image.o),则$@为mytarget.so,而$%为image.o。AR归档维护程序的名称,默认值为ar。ARFLAGS归档维护程序的选项。AS汇编程序的名称,默认值为as。ASFLAGS汇编程序的选项。GNUmake的主要预定义变量CC C编译器的名称,默认值为cc。CFLAGS C编译器的选项。CPP C预编译器的名称,默认值为$(CC)-E。CPPFLAGS C预编译的选项。CXX C++编译器的名称,默认值为g++。CXXFLAGS C++编译器的选项。FC FORTRAN编译器的名称,默认值为f77。FFLAGS FORTRAN编译器的选项。LDFLAG 链接器的选项Makefile的隐含规则
在上面的例子中,几个产生目标文件的命令都是从“.c”的C语言源文件和相关文件通过编译产生“.o”目标文件,这也是一般的步骤。实际上,make可以使工作更加自动化,也就是说,make知道一些默认的动作,它有一些称作隐含规则的内置的规则,这些规则告诉make当用户没有完整地给出某些命令的时候,应该怎样执行。例如,把生成prog.o和code.o的命令从规则中删除,make将会查找隐含规则,然后会找到并执行一个适当的命令。由于这些命令会使用一些变量,因此可以通过改变这些变量来定制make。象在前面的例子中所定义的那样,make使用变量CC来定义编译器,并且传递变量CFLAGS(编译器参数)、CPPFLAGS(C语言预处理器参数)、TARGET_ARCH(目标机器的结构定义)给编译器,然后加上参数-c,后面跟变量$<(第一个依赖文件名),然后是参数-o加变量$@(目标文件名)。Makefile隐含规则当使用make编译.c文件时,.c源文件和命令不必明确给出。当目标文件为N.o时,源文件自动默认为N.c。综上所述,一个C编译的具体命令将会是:
${CC}${CFLAGS}${CPPFLAGS}${TARGET_ARCH}–c$<-o$@编译器编译器选项预编译选项目标机器结构只编译不连接对第一个依赖文件编译目标名称就是目标的全名隐含规则举例在上面的例子中,利用隐含规则,可以简化为:OBJS=prog.ocode.oCC=gcctest:${OBJS} ${CC}–o$@$^
prog.o:prog.c
prog.hcode.h
code.o:code.ccode.h
clean:
rm–f*.o对所有依赖文件编译并链接Makefile假想目标假想目标(PhonyTargit)并不是真正的文件名,仅仅是制定的一个具体规则所执行的命令名称。常用的假想目标有all、clean等。all的用法all:exec1exec2Clean的用法clean:
rm*.otemp在shell下输入makeclean会执行rm*.otempMakefile实例(1/3)#以#开头的为注释行
test:prog.ocode.o
gcc–otestprog.ocode.o
prog.o:prog.c
prog.hcode.h
gcc–cprog.c–oprog.o
code.o:code.ccode.h
gcc–ccode.c–ocode.o
clean:
rm–f*.o上面的Makefile文件中共定义了四个目标:test、prog.o、code.o和clean。目标从每行的最左边开始写,后面跟一个冒号(:),如果有与这个目标有依赖性的其他目标或文件,把它们列在冒号后面,并以空格隔开。然后另起一行开始写实现这个目标的一组命令。在Makefile中,可使用续行号(\)将一个单独的命令行延续成几行。但要注意在续行号(\)后面不能跟任何字符(包括空格键)Makefile实例(2/3)一般情况下,调用make命令可输入:#maketargettarget是Makefile文件中定义的目标之一,如果省略target,make就将生成Makefile文件中定义的第一个目标。对于上面Makefile的例子,单独的一个“make”命令等价于:#maketest因为test是Makefile文件中定义的第一个目标,make首先将其读入,然后从第一行开始执行,把第一个目标test作为它的最终目标,所有后面的目标的更新都会影响到test的更新。第一条规则说明只要文件test的时间戳比文件prog.o或code.o中的任何一个旧(前),下一行的编译命令将会被执行。Makefile实例(3/3)但是,在检查文件prog.o和code.o的时间戳之前,make会在下面的行中寻找以prog.o和code.o为目标的规则,在第三行中找到了关于prog.o的规则,该文件的依赖文件是prog.c、prog.h和code.h。同样,make会在后面的规则行中继续查找这些依赖文件的规则,如果找不到,则开始检查这些依赖文件的时间戳,如果这些文件中任何一个的时间戳比prog.o的新(后),make将执行“gcc–cprog.c–oprog.o”命令,更新prog.o文件。以同样的方法,接下来对文件code.o做类似的检查,依赖文件是code.c和code.h。当make执行完所有这些套嵌的规则后,make将处理最顶层的test规则。如果关于prog.o和code.o的两个规则中的任何一个被执行,至少其中一个.o目标文件就会比test新(后),那么就要执行test规则中的命令,因此make去执行gcc命令将prog.o和code.o连接成目标文件test。在上面Makefile的例子中,还定义了一个目标clean,它是Makefile中常用的一种专用目标,即删除所有的目标模块make命令行选项
直接在make命令的后面键入目标名可建立指定的目标,如果直接运行make,则建立第一个目标。还可以用make-fmymakefile
这样的命令指定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年初级银行从业资格之初级公司信贷考试题库300道及答案【夺冠系列】
- 2026年科普知识题库及答案【易错题】
- 2026年公共卫生与预防医学题库200道含完整答案(易错题)
- 2026年资料员之资料员基础知识考试题库300道及答案(考点梳理)
- 2026年二级造价师考试题库500道及完整答案1套
- 2026年国家电网招聘之经济学类考试题库500道附参考答案(巩固)
- 2026年土地登记代理人之土地登记相关法律知识考试题库500道含答案(预热题)
- 龙岩中考音乐试卷及答案
- 舒城二中考试试卷及答案
- 2026年大学生计算机考试题库200道附参考答案(轻巧夺冠)
- DL∕T 1052-2016 电力节能技术监督导则
- 输液港的使用及维护(精制手工图文)
- DL-T-5743-2016水电水利工程土木合成材料施工规范
- 常用生化检查
- 冬季绿化养护工作计划
- 2024中国绿色甲醇产业研究与前景展望-云道资本
- 项目干系人管理与沟通计划
- 政府基金公司招聘笔试题
- 2024年全国初中数学联合竞赛试题参考答案
- 中文系汉语言文学专业写作课件三
- 国开电大软件工程形考作业3参考答案
评论
0/150
提交评论