您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 第十章 Linux C语言的开发环境
第十章LinuxC语言的开发环境北京交通大学计算机学院1.1编译语言的基本认识1.1.1编译器与解释器常见的高级语言可分成两种,一种叫编译语言,一种叫解释性语言,无论是编译或解释性语言,都需要一个编译程序把人类所下达的命令编译成计算机内部的语言.差别在于编译方式的不同,编译程序的编译程序叫编译器,解释性语言的编译程序叫解释器.编译器是以整批作业的方式进行编译工作,首先必须完成源程序编写,并以编辑程序输入存为文件后,才能由编译器读入\编译,并且把编译的结果存为文件.这种经编译器编译成的文件,称为目标文件(ObjectFile).必须在整个编译作业完成,并产生可执行的目标文件后,才能把此目标文件交给计算机执行。目前大多数的系统还要经过链接处理才能执行。常见的编译语言有C/C++、Delphi、Kylix,Pascal等。编译语言的另一项优点是,编译过的程序可以多次使用,通常,都将一些常用的程序片段写成独立的函数,并把这些模块集成一个文件,在使用时就从此文件中抽取需要的函数模块来链接,这种由常用的函数模块所组成的文件称为函数库。解释器的工作方式与编译器不同,解释器不是事前整批作业的方式,而是在程序执行时,以实时的方式进行编译,每读一行编译一行,并送给计算机执行,然后再继续再继续读入下一行。常见的解释性语言有Shellscript,Python1.1.2解释性语言与编译语言的比较由于解释性语言不做事先的编译,因此没有编译及链接的过程。操作过程简便、迅速。并具有监督执行状况的功能。它通常容易学习,且十分友好,特别适合初学者。编译语言的优点是事先整批编译,而在执行过程中不必再次编译,所以执行速度很快,编译语言的主要缺点是操作过程过于复杂,从程序的编辑、编译、链接到执行,再加上来回调试,无论是方法或时间上都很费力费时。目前在Linux上最广泛使用的C语言编译器是GCC。1.2GCC简介GCC(GNUCompilerCollection)是一套由自由软件基金会(FSF,FreeSoftwareFoundation)开发的C语言编译器。问世于1987年3月22日,经过版本的不断更新,目前最新版本为3.x版。GCC有如下特点:.软件获取方便:GCC已包括在各Linux发行版的光盘中。.良好的执行效果:GCC同时整合了编译器与链接器,因此可以将编译与链接同时执行.同时GCC产生的可执行文件,在文件大小和执行效率上也很理想..具有众多的参数:GCC执行时可选择的参数很多,借助这些丰富的参数,使编译很有弹性.虽然GCC的参数众多,但这并不表示难以使用,一般的程序代码如果不加任何参数,也可顺利编译成功..跨多种操作平台:凭借着GNU自由与开放的精神,除了Linux外,GCC还被移植到大多数热门的操作平台上。例如:Solaris,BSD,OS/s.良好的兼容性:GCC除了符合标准的ANSIC规范之外,还与早期C编译器的规范兼容。1.3C程序的开发过程1)上机前,先把程序在纸上设计编写好。2)在文本编辑器中输入程序,并存成C源程序文件(扩展名为.c)3)执行编译器,把源程序编译成目标程序(扩展名为.o)4)执行链接器,链接由编译器产生的目标程序。编译器会链接所指定的各个目标文件及函数库文件,然后产生一个可执行文件。5)执行产生的可执行文件,如果一切无误,程序便开发成功了。6)如果发现错误,则再回到第1或第2步骤来修改程序,然后再次编译、链接,这个动作要一直重复,直到程序能正确执行为止。在GCC中,第3、4项操作过程都已整合在GCC命令中,不需要再个别调用编译器、链接器,操作起来十分方便。1.4编缉一个C程序在Linux中,root用户具有至高无上的权限,因此为了安全,建议最好改用一般权限的帐号。#vihi.c注意:在Linux中区分大小写,C程序的扩展名取名为小写的.c,而非大写的.C另外,C语言是区分大小写的,如编译器会把main、Main与MAIN看成是完全不同的3个名称。hi.c的内容:main(void){printf(“Hi!C!\n”);}1.5C程序编译与执行编辑好源程序后,必须使用编译器把源程序编译成计算机所熟悉的形式,这种计算机所熟悉的程序叫做目标程序,在Linux中,目标程序文件以.o为扩展名。用户的程序编译成目标程序后,还要经过链接的环节与必要的模块链接后才能执行。在Linux中,可执行文件并没有特别的扩展名。1.5.1编译与执行程序#gcchi.c假如一切过程无误,编译完成后,执行:#lsa.outhi.c在执行gcc命令时,若不加任何参数,默认会产生名称为a.out的可执行文件,此时,接着执行a.out,看看执行的结果:#./a.outHi!C!请注意程序前面加上了“./”,表示此文件位于当前目录下。1.6在Linux开发程序的技巧1、指定产生可执行文件的文件名:当执行GCC编译时,默认时产生文件名为a.out的可执行文件,你可在执行gcc命令时,加上“-o可执行文件的文件名“参数,指定产生的可执行文件名。#gcc–ohihi.c#lshihi.c2.执行文件时不需加上路径加上“./”的原因是:在Linux执行文件时,若不加上文件的路径,则默认是依据PATH环境变量中指定的路径。要查看目前的PATH环境变量,执行以下命令:#echo$PATH为了解决这个问题,可执行以下命令,将当前目录加入PATH环境变量中,然后执行当前目录下的可执行文件时,就不用再加上“./”了。#PATH=“$PATH:.”#echo$PATH#hiHi!C!不过,上述的方法只具有暂时性的作用,当下次再登入系统时,它就会失效。如果想在每次登入系统后,都能自动加上当前目录的路径,则请编辑主目录下的.bashrc文件,将上面这段命令加入后存盘即可。#.bashrc#Userspecificaliasesandfunctions#Sourceglobaldefinitionif[-f/etc/bashrc];then./etc/bashrcfiPATH=“$PATH:.”4.停止执行中的程序有时可能会因为程序本身的问题,导致程序执行时该程序非预期地执行下去,而无法自己结束。按[Ctrl]+[C]键,看能否将执行的程序结束,若还是不行,执行psaux命令查询系统目前执行的所有程序:#psaux接着执行以下命令中止此程序继续执行:#kill42291.7#include与stdio.h#include是一个预处理命令,用来把指定的文件包含到主程序内。1)#include的用法:#include的使用格式有两种:#include“文件名”指示编译器到目前的工作目录去搜索所要包含的文件,如果工作目录找不到该文件,则再到系统的标准目录中查找。#include文件名指示编译器要到系统的标准目录中查找所要包含的文件。#includestdio.hmain(void){intc;while((c=getchar())!=EOF)putchar(c);}1.8使用make命令make是Linux提供的一个公用工具,通常使用make来编译系统核心或安装及更新软件.此外,当开发大型项目时,大多是分别开发数个小程序,经过编译后再链接成一个文件.例如下面的例子,若不使用make命令来编译与链接这些文件,则这样做:#gcc–cmain.c#gcc–cfile1.c#gcc–cfile2.c#gcc–cfile3.c#gcc–ofilemain.ofile1.ofile2.ofile3.o按上述,一旦修改了其中一个程序,就必须将该程序重新编译一次,再和其他文件重新进行链接。当文件的数目多到一定数量时,就很难按照上述的方法进行程序的编译与链接。make命令可以自动地执行程序,甚至当修改了其中部分的文件内容后需要重新编译时,它也可以自动执行,从而可以减少在重复编译时所做的操作及时间。1.8.1makefile的结构makefile文件是一个描述文件,它描述了各个文件间的层次关系。用下面的例子来说明。filea.c#includestdio.h#include“head.h”main(void){func1();func2();printf(s3);}续上页fileb.c#includestdio.h#include“head.h”func1(){printf(S1);}续上页filec.c#includestdio.h#include“head.h”func2(){print(S2);}续上页head.h#defineS1“string1\n”#defineS2“string2\n”#defineS3“string3\n”按照文件的依存关系,可以为上列的程序创建一个makefile:#fileabc的makefile描述文件这是注释myfile:filea.ofileb.ofilec.o附属行gccfilea.ofileb.ofilec.o–omyfile命令行filea.o:filea.chead.h附属行gcc–cfilea.cfileb.o:fileb.chead.hgcc–cfileb.cfilec.o:filec.chead.hgcc–cfilec.c在这个makefile中共有4个项目,每个项目都是由一个附属行及命令行组成,附属行是告诉make由目标的必备文件产生目标文件;而命令行则通过Tab键告诉make它是命令行,并且描述产生目标文件所要下达的参数命令。完成之后将这个文件以makefile为名和源文件存储在同一个目录中。接下来执行make命令:#makegcc–cfilea.cgcc–cfileb.cgcc–cfilec.cgccfilea.ofileb.ofilec.o–omyfile#myfilestring1string2string31.利用make命令更新目标文件制作makefile文件还有一个好处,就是当其中一个文件被更新后,执行make命令时会先比较.c文件的创建日期是否比.o文件的创建日期更新,然后再比较.o文件的日期是否比可执行文件更新。如果必备文件的创建文件日期比目标文件更新,则系统会针对更改过的文件重新编译并重新链接。2.更新文件创建的时间根据make的特性,只要目标的必备文件时间比目标文件早,则make就不更新目标文件。在这种情况下,如果希望对这些文件再进行编译,则可以使用-t这个参数。make–t文件1[文件2…]1.8.2makefile的简化及宏1、缩写可以使用make预先定义的缩写来代替文件名:$*$*是目标文件名的通配符,可以代替任何主文件名。例如:filea.o:filea.chead.hgcc–c$*.cmake由第1行知道主文件名为filea.o,所以在$*处自动以filea代替。$@$@代表目标文件的全名(包括扩展名),例如:filea.o:filea.chead.hgcc–c$@make提供了一个字尾规则以简化输入:.扩展名1.扩展名2;命令扩展名1的文件通过执行命令而转成扩展名2的文件myfile:filea.ofileb.ofilec.ogccfilea.ofileb.lfilec.o–omyfile.c.o:gcc–c$表示.c.o中的.c文件2.宏为了让makefile更加简洁,同时也避免重复输入时可能造成的错误,可以利用宏来简化输入的操作。宏的格式如下:name=textstring宏名称宏代表的字符串例如在下面的范例中,定义了一些宏:obj=filea.ofileb.ofilec.ohd=head.h如果在makefile中定义了上述宏,则可写成:myfile:${obj}${CC}${obj}–omyfile这是make事先定义的功能命令,代表C程序的编译器上机实验1.编写一请用户输入password的程序,输入错误三次即结束执行。2、编写一程序输入20个学生的成绩,成绩在80—100分列A,60—79分列为B,60分以下为C,然后输出得A、B、C的各有几人。
本文标题:第十章 Linux C语言的开发环境
链接地址:https://www.777doc.com/doc-3284648 .html