已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 Linux编程基础对Linux的全面掌握并精通,个人认为至少应该掌握4部分内容,即操作系统级别上的各种操作、对Linux内核源码的剖析、Shell脚本编程以及在Linux上的编程。众所周知,Linux是通过C语言编写的,因此它对C/C+具有天生的良好支持,而且在Linux下使用C/C+编程的开发人员也比较庞大。本章主要讲述Linux下C/C+编程基础,它是深入学习Linux编程的前提,同时也介绍在Linux下使用其他语言编程,如Java、Perl等。本讲义主要包括以下部分: GNU C/C+编译器 GUN make工具 GNU调试器 常用IDE介绍 Linux上其他编程语言1.1 GNU C/C+编译器1.1.1 GNU简介GNU的意思是“GNUs Not UNIX”单词的缩写,这种取名方式表现了一种幽默。在20世纪80年代初,Richard Stallman引发了一场软件业的革命。他将“自由软件”的思想向世人推广,认为软件应该是“平等自由”的,即发布软件的时候应该将其源码一起公布。好处是既可以让用户在源码的基础上按照自己的要求修改软件,更重要的是它能经过多人的代码优化,提高自身的质量,纠正软件的错误。GNU的确不是UNIX,它是一种有别于UNIX模式的计划,Linux便是这个计划的产物之一。Linux对用户不再有任何许可证方面的限制,遵守GNU的公共许可证(GNU PublicLicense,GPL)。按照GPL发行的软件是自由的,获得这个软件再转卖其他人是合法的,但是卖方必须将完整的源代码以及对它的任何增补都要转移给买方。当年Linus Torvalds发布Linux系统的时候,选择采用GPL制度来发行。由于Linux本身开放的特性,现在它已经拥有了数目可观的拥护者与开发人员。1.1.2 C/C+编译器开发人员使用某种编程语言编写好程序源代码,通过该语言的编译器可以编译为可执行的二进制目标文件,目标文件可以供用户将来执行使用。Linux上常用的开发语言便是C/C+,因此本节详细讲述C/C+编译器的用法。Linux上最常用的编译器是gcc,它是GNU的C/C+编译器,实际上gcc能够编译3种语言,包括C、C+和Object C(C语言的一种面向对象扩展)。在Linux下,利用gcc命令可以同时编译并链接C和C+源程序。1. 安装gcc编译环境在安装RedHat 9过程中选择安装“开发工具”后,系统便会自动安装gcc编译环境。如果在安装系统时没有选择安装“开发工具”,则在RedHat图形界面选择“添加/删除应用程序”菜单项,如图1-1所示(以GNome方式下的图形界面为例)。图1-1 选择“添加/删除”程序菜单弹出如图1-2所示对话框,在该对话框内选择“开发工具”复选框,然后单击“更新”按钮,让系统自动从安装光盘上找到gcc编译环境需要的安装包,然后完成gcc编译环境的安装。图1-2 选择“开发工具”选项当然,同样也可以在shell方式下安装gcc编译环境,只不过安装的过程中会提示安装具有依赖关系的库(通常为glibc),需要用户先手工依次安装这些库。使用shell方式适合没有安装光盘的情况,事先通过网络或者其他方式将安装gcc需要的包下载到本地硬盘上。首先,看一下没有安装gcc编译环境时,系统中带有“gcc”名称的rpm包,如图1-3所示为操作过程与结果。图1-3 系统中带有“gcc”名称的rpm包(安装gcc前)同理,查看系统没装gcc时与glibc有关的rpm包,如图1-4所示。图1-4 系统中带有“glibc”名称的rpm包(安装gcc前)在shell方式下,通过以下命令可以查看到底gcc是否已经安装,具体操作如图1-5所示。图1-5 shell下查看是否安装有gcc编译器如图1-5所示,没有找到gcc命令,表示当前系统没有安装gcc编译器。通过网络下载得到的gcc的rpm包,使用rpm命令安装的过程中出现需要与该包依赖的某些库没有安装,则再下载这些库的rpm包,直到能够安装gcc包为止。通过rpm命令查看gcc包的操作如图1-6所示。图1-6 系统中带有“gcc”名称的rpm包(安装gcc后)同理,查看系统安装gcc后与glibc有关的rpm包,操作如图1-7所示。图1-7 系统中带有“glibc”名称的rpm包(安装gcc后)此时,在使用gcc命令,得到如图1-8所示结果,表示gcc编译环境已经建立成功。图1-8 gcc安装成功2. gcc的基本使用方法在Linux下,使用gcc命令编译C/C+源文件,该命令与大多数Linux命令一样也可以带参数,甚至gcc命令带的参数更复杂。本部分只是通过一个简单的程序引导大家掌握gcc命令最基本的使用方法。假设一个程序只有一个源文件hello.c,其内容如图1-9所示。图1-9 hello.c源代码则只需键入gcc就可以编译、连接并生成一个可执行文件,具体操作如图1-10所示。图1-10 编译并执行hello.c第3行告诉gcc对hello.c进行编译,使用-o参数表示编译链接后的输出文件名为hello。如果不使用-o参数,编译链接后的输出文件名一律为a.out。第6行表示执行可执行文件hello,第7行看到了hello程序执行的结果。3. gcc的实现机制用gcc编译的C/C+程序生成可执行文件看起来好像是一步就完成了,但实际上它要经历如下步骤:(1)预处理(Preprocessing):这一步需要分析各种命令,如#include、#define、#if等。gcc调用cpp程序来进行预处理工作。(2)编译(Compilation):根据用户输入文件产生汇编语言,由于通常是立即调用汇编程序,所以其输出一般不保存在文件中。gcc调用ccl程序进行编译工作。(3)汇编(Assembly):将汇编语言作为输入,产生具有.o扩展名的目标文件。gcc用as程序进行汇编工作。(4)链接(Linking):各个目标文件.o被放在可执行文件的适当位置上,该程序引用的函数也放在可执行文件中(对使用共享库的程序稍有不同)。gcc调用链接程序ld来完成最终的任务。gcc是怎样知道如何处理某种特殊类型的文件呢?它是依靠文件的扩展名来决定如何正确处理该文件的。表1-1给出了gcc识别的最常用文件扩展名以及含义。表1-1gcc对文件扩展名的解释扩展名类型.cC语言源代码.C,.ccC+语言源代码.i预编译后的C语言源代码.ii预编译后的C+语言源代码.S,.s汇编语言源代码.o编译后的目标代码.a,.so编译后的库代码4. gcc常用参数gcc命令的可选参数相当巨大,选项长度可以达数页,在表1-2中列出最常用的部分。表1-2gcc命令常用参数扩展名类型-o FILE指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,默认输出文件名为a.out-c只编译不链接-DFOO=BAR在命令行定义预处理宏FOO,其值为BAR-IDIRNAME将DIRNAME加入到包含文件的搜索目录列表中-LDIRNAME将DIRNAME加入到库文件的搜索目录列表中-static链接静态库,执行静态链接。默认情况下gcc只链接共享库-IFOO链接名为libFOO的函数库-g在可执行程序中包含标准调试信息-ggdb在可执行程序中包含只有GNU debugger(gdb)才能识别的大量调试信息-O优化编译过的代码-ON指定代码优化级别为N,0=N foo%: force$(MAKE) -f mfile $force: ;当执行make foo时,make找到makefile,执行命令 frobnicate foo;执行make bar时,在makefile中未找到相应的规则,这时模式规则适用,执行命令make f mfile bar,makefile中未提及的其它目标也是类似的。这种方法之所以工作是因为模式规则的模式是%,可以匹配任何的目标;这条规则的依赖是force,保证即使目标存在命令也会执行;force规则的命令为空防止make为其搜索隐式规则这样会导致依赖循环。1.2.11 规则详述makefile中的规则描述如何生成特定的文件,即规则的目标。规则列出了目标的依赖文件,指定生成或更新目标的命令。规则的次序是不重要的,除非是确定缺省目标:缺省目标是第一个makefile中的第一个规则;如果第一个规则有多个目标,第一个目标是缺省的。有两个例外:以.开头的目标不是缺省目标;模式规则对缺省目标没有影响。通常我们所写的地一个规则是编译整个或makefile中指定的所有程序。1例子foo.o : foo.c defs.h # module for twiddling the frobscc -c -g foo.c它的目标是foo.o,依赖于foo.c和defs.h,有一个命令cc c g foo.c。命令行以TAB字符开始标识它是一个命令。这条规则说明两件事:(1)如何决定foo.o是旧的:如果它不存在,或者foo.c或者defs.h比它新。(2)如何更新foo.o文件:通过运行cc程序。命令未提及defs.h,担可以猜想foo.c包含了它,这是defs.h被置于依赖关系中的理由。2规则语法语法如下:TARGETS : DEPENDENCIESCOMMAND.或者TARGETS : DEPENDENCIES ; COMMANDCOMMAND.TARGETS是以空格隔开的文件名,统配符可以使用。通常一个规则只有一个目标,偶尔也有多个。命令行以TAB键开始。第一条命令可在依赖关系的下一行;或者在同一行,在分号后面;两种方式效果相同。因为$符号被用做变量引用,如果要在规则中使用$符号,必须写两个:$。可以用符号来分割一个长行,这不是必须的,因为make对行的长度没有限制。3通配符规则中的文件名可以包含统配符,如*,?。文件名前的字符有特殊的含义。单独使用,或跟随一个/,代表用户的home目录,比如/bin扩展为/home/you/bin;如果跟随一个单词,表示单词指示的那个用户的home目录,如john/bin扩展为/home/john/bin。通配符在目标,依赖关系,命令中自动扩展,其它情况下,统配符的扩展除非显式使用wildcard函数。通配符的特殊意义可以使用符号关闭。例子:clean:rm -f *.o和print: *.clpr -p $?touch print通配符在定义变量时并不扩展,例如:objects = *.o则objects的值是字符串*.o;但是如果你将objects用于目标,依赖或命令中,扩展会进行。要将objects设置成扩展过的内容,使用:objects := $(wildcard *.o)(1).通配符的缺陷这是一个使用通配符的例子,但结果不是你所期望的。假设可执行文件foo是从当前目录中的所有.o文件生成的:objects = *.ofoo : $(objects)cc -o foo $(CFLAGS) $(objects)objects变量的值是字符串*.o。通配符扩展在规则foo中进行,于是所有存在的.o文件成为foo的依赖而且在需要时重新编译。但如果删除了所有的.o文件呢?当通配符不匹配任何文件时,一切都保持原样:则foo依赖于一个叫做*.o的文件;由于这个文件不大可能存在,make程序会报告一个无法生成*.o文件的错误,这不是期待的结果。实际上可以用通配符获得期望结果,但是需要复杂的技术,包括wildcard函数和字符串替换函数。(2)wildcard函数通配符自动在规则中进行。但是在变量赋值的和函数的参数中通配符不会扩展,如果在这些情况下需要通配符扩展,必须使用wildcard函数。语法如下:$(wildcard PATTERN.)这个在makefile任何地方出现的字符串,会被匹配任何一个文件名格式的以空格隔开的现有文件列表替换。如果没有任何文件匹配一个模式,这个模式从wildcard的输出中忽略,注意,这和上述的通配符的处理是不一样的。wildcard函数的一个功能是找出目录中所有的.c文件:$(wildcard *.c)可以通过替换后缀.c为.o从C文件列表得到目标文件的列表:$(patsubst %.c,%.o,$(wildcard *.c)这样,上节中的makefile改写为:objects := $(patsubst %.c,%.o,$(wildcard *.c)foo : $(objects)cc -o foo $(objects)这个makefile利用了编译C程序的隐含规则,所以不需要对编译写出显式的规则。(:=是=的一个变体)注意:PATTERN是大小写敏感的。4目录搜索对于大的系统,通常将源文件和目标文件放在不同的目录中。目录搜索功能可以让make自动在多个目录中搜寻依赖文件,当你将文件重新分布是,不需要改变规则,更改搜索路径即可。(1)VPATH变量make变量VPATH列出make应当搜索的目录列表。很多情况下,当前目录不包含依赖文件,VPATH描述一个对所有文件的搜索列表,包含那些是规则的目标的文件。如果一个目标或者依赖文件在当前目录没找到的话,make在VPATH中列出的目录中查找同名的文件。如果找到的话,那个文件成为依赖文件;规则可以象这些文件在当前目录中一样来使用他们。在VPATH变量中,目录名以冒号或空格隔开;目录列出的顺序决定make查找的顺序。(注:在pSOSystem 2.5移植到Win32的GNU make目录名必须使用分号隔开,以下均简称Win32 GNU make)。举例说明:VPATH = src:./headers 则规则foo.o : foo.c 被解释为foo.o : src/foo.c假设foo.c在当前目录不存在,在src目录中可以找到。(2)选择性搜索与VPATH变量相似但更具选择性的是vpath指令(注意是小写),可以指定对于符合特定模式文件的查找路径。这样可以为不同类型的文件指定不同的搜索路径。vpath指令共有三中形式:avpath PATTERN DIRECTORIES为匹配PATTERN的文件名指定搜索路径DIRECTORIES,目录的分隔和VPATH的相同。bvpath PATTERN清除为匹配PATTERN的文件名指定的搜索路径。cvpath清除所有以前用vpath指定的搜索路径。vpath的模式是包含%的字符串:这个字符串必须匹配需要搜索的依赖文件名,%字符匹配0个或多个任意字符。例如:%.h匹配任何以.h结尾的文件(如果没有%,则PATTERN必须和依赖文件完全一致,这种用法不太多)。当当前目录中不存在依赖文件时,如果vpath中的PATTERN匹配依赖文件名,则指令中DIRECTORIES列出的目录和VPATH中同样处理。举例:vpath %.h ./headers告诉make在当前目录中未找到的.h文件在./headers目录中查找。如果多个vapth的模式匹配依赖文件名,make将逐一处理,在所有指定的目录中搜索。Make按照vapth在makefile中的次序;来处理它们,多个相同模式的vapth是相互独立的。vpath %.c foovpath % blishvpath %.c bar将按照foo,blish,bar的次序查找.c文件。而vpath %.c foo:barvpath % blish按照foo,bar,blish的顺序搜索。(3)使用自动变量目录搜索的结果并不改变规则中的命令:命令按原样被执行。因此,必须写出与目录搜索功相适应的命令。这可以通过使用$这样的自动变量来完成。$表示规则中的所有依赖文件,包含它们所在的目录名(参见目录搜索);$表示目标。例如:foo.o : foo.ccc -c $(CFLAGS) $ -o $通常情况下,依赖文件也包含头文件,但命令中并不提及这些文件:变量$表示第一个依赖文件:VPATH = src:./headersfoo.o : foo.c defs.h hack.hcc c $(CFLAGS) $ $和bigoutput : text.ggenerate text.g -big bigoutputlittleoutput : text.ggenerate text.g -little littleoutput等同。这里假设程序generate产生两种输出:一种使用-big选项,一种使用-little选项。如果想象使用$变化命令那样来变化依赖关系,不能通过多目标的普通规则实现,但是可以通过模式规则来实现。10一个目标多条规则一个文件可以是多条规则的目标,所有规则的依赖关系被合并。如果目标比任一个依赖文件旧,命令被执行。一个文件只能有一组命令执行。如果多个规则对于同一个文件都给出了命令,make使用最后一组并打印错误信息(特殊情况:如果文件名以.开始,并不打印错误信息,这一点是为了和其它make兼容)。没有任何理由需要将makefile写成这样,这是make给出错误信息的理由。一条只有依赖关系的附加规则可以一次给出许多文件的附加依赖文件。例如objects变量表示系统中编译器的所有输出.,说明当config.h更改时所有文件必须重做的简单方法如下:objects = foo.o bar.ofoo.o : defs.hbar.o : defs.h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年综合管理师招聘面试参考题库及答案
- 2025年以上公务员招聘面试参考题库及答案
- 会计综合实操题库及答案
- 2025年高级会计师招聘面试参考题库及答案
- 2025年新能源技术工程师招聘面试参考题库及答案
- 税务师真题分章节题库及答案
- 2025年公共财政专员招聘面试题库及参考答案
- 银行招聘题库及答案详解
- 2025年风险评估师招聘面试参考题库及答案
- 2025年便携式电子设备工程师招聘面试题库及参考答案
- 2025年英语四级考试试卷及答案
- 处方药学类试题及答案
- 《资产负债表(适用执行民间非营利组织会计制度的组织)》
- 机房运维考试试题及答案
- 2025年残疾人士救助金发放合同
- 《发票发票知识培训》课件
- 泵站工岗位责任制模版(2篇)
- 《铁路技术管理规程》(普速铁路部分)
- 2024年秋季新版苏科版八年级上册物理课件 跨学科实践 乐器的调查与制作
- 科普专家团管理制度内容
- 离职员工不损害公司声誉保证书
评论
0/150
提交评论