《Linux下C编程 (2).pdf》由会员分享,可在线阅读,更多相关《Linux下C编程 (2).pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章Linux 系统下C 语言程序设计目前Linux 已经被广泛的使用,因此有必要简单介绍一下,在Linux 系统下如何进行C语言程序设计。首先介绍在Linux 下如何编辑C 语言源程序,接下来介绍如何编译C 语言源程序,最好介绍如何调试与运行C 语言源程序。由于不是所有用户的Linux 系统中都安装了GCC 系统,因此有必要先介绍一下GCC 的安装。2.1GCC 的安装Linux 与Unix 类似,完全由C 语言编写而成,因此天生的支持C语言。在目前主流的Linux 发行版本中都包含了GNU 的C 语言编译器(简称GNU C,或称为GCC)。如果当前的Linux 系统中没有安装GCC,可以
2、访问下面的站点搜索所需的安装文件:http:/www.gnu.org/或直接访问ftp:/ftp.gnu.org/gcc 然后进行安装即可。在安装之前,需要下载GCC 编译器、所需的库文件和联机帮助文件,这些文件一般以压缩文件格式(.tar或.zip)提供,需要解压缩后使用。目前 GCC的版本为 3.2.2,下载其 相关的文件即可。根据具体的情况,安装GCC 有如下三种方法:1)升级现有Linux 系统:适用于具有Linux 安装光盘,但是当前的系统没有安装GCC系统。2)通过RPM 安装:适用于具有Linux 安装光盘,并且包含相关的安装文件。3)从Internet 下载:适用于没有Linu
3、x 安装光盘,但是可以接入互联网(WWW)。第一种方法基本上是升级当前的Linux 系统,因此需要如下的步骤:1)备份当前系统的重要文件;2)插入Linux 安装光盘。执行系统安装。比较简单的方式是从光盘引导系统;3)选择常规模式,并进入安装过程;4)选择升级模式;5)选择相关的升级包,主要包括 Develpoment/Debuggers、Develpoment/Languages、DevelpomentLibraries、DevelpomentTools;6)等待安装结束即可。第二种方法类似安装应用软件,利用了RedhatPackageManger(RPM)技术。基本思 路是先在Linux
4、系统或互联网(WWW)中查找相关的RPM 安装包,并下载到本机。安装 过程包括如下的步骤:1)启动X-Windows;2)插入Linux 安装光盘;3)单击CD-ROM 图标;4)单击RPM 图标,启动RPM;5)选择Fil 菜单的下的Open 命令;-1-6)选择/mnt/cdrom 路径,并找到PRMS 子目录;7)选择相应的安装包,对于不同版本的 Linux,其安装包可能不相同。例如可能是gcc-c+.rpm 或egcc-c+.rpm.;8)双击安装包,然后在提示对话框中选择Install 按钮;如果不启动X-Windows,可以执行如下的命名:1)以管理员身份登录2)装载光盘mout/
5、mnt/cdrom3)进入PRMS 子目录4)安装相应的安装包。5)rpm igcc-c+-dev第三种方法是通过互联网(WWW)下载相关的安装文件,这时获得最新版本的最快方法。基本步骤如下:1)下载相关文件,假设为gcc-c+_3_2_2.tar.gz;2)将文件复制一个空目录后,执行如下的命令,即可;gunzip gcc-c+_3_2_2.tar.gztar-tf gcc-c+_3_2_2.tartar-xvf gcc-c+_3_2_2.tar2.2C 语言源程序的编辑GCC并不是一个完整的集成开发环境,因为其不提供程序代码的编辑器。C语言程序的编辑需要通过的其他应用软件来完成。一般的Li
6、nux 系统都提供了文本编辑器软件Vi,下面主要介绍Vi 编辑器。在X-Windows 下还有许多的软件可以完成C 语言程序的编辑工作,这里不一一介绍。2.2.1vi 简介vi 使用了两种状态,一是命令状态(Command Mode),另一是插入状态(Insert Mode)。当vi 处于命令状态时,输入的内容将作为命令来解释;另一方面,当vi 处于插入状态时,就可以插入字符。大多数 vi 命令是单字符,由插入状态改变为命令态,指 Esc 键;而由命 令状态转为插入状态,则可以输入相应的插入命令,直接输入,无需再按回车键。命令iIaAoO说明在光标前插入正文在当前行开始处插入正文在光标后插入正
7、文在当前行末尾插入正文在当前行后插入一新行在当前行前插入一新行表 2-1插入命令列表注意,在插入状态,不能输入命令,必需先按下Esc 键,返回命令状态。在任何的状态下,按下Esc 键,都会返回命令状态。-2-2.2.2vi 启动在控制台下输入$vi或$vi 文件名即可启动 vi编辑器。如果文件是一个新文件,就会在屏幕底部现实一个信息,说明用户正在创建新文件。2.2.3建立新文件在控制台下输入$vi或$vi 新文件名 即可建立新文件,这时可以输入相关的文本即可。其中“vi”的作用是启动vi 环境并建立一 个空文档。“vi 新文件名”的作用是建立以“新文件名”的空文件。2.2.4打开文件在控制台下
8、输入$vi 文件名即可启动vi的同时,打开名为“文件名”的文件。如果文件早已存在,vi 则会显示文件的首24 行。2.2.5保存与退出完成文件的修改之后,必须完成文档的保存,以及退出当前的文件。在 vi 系统中,在进行保存或退出时,必须首先回到命令状态。如果屏幕的左下方出现冒号(:),表示vi 进入 命令状态,可以进行存档或退出等工作。在vi 环境下,按Esc 键退出编辑环境,进入命令环境,输入“:q!”或“:wq”命令。其中“:q!”命令表示放弃当前的修改,并退出系统。“:wq”命令表示保存当前的修改,并退出系统。如果当前文件还没有命名需要使用:w 命令,例如:w test.c将当前的内容保
9、存为名为test.c 的文件。下面是一些常用的命令列表。命令:q!:w:wq:x:zz说明放弃任何改动并退出vi 系统保存当前的文件保存当前的文件,并退出vi 系统与wq 类似与wq 的工作类似-3-表2-2保存与退出命令2.2.6文件的编辑文件的所有编辑的操作必须在插入状态下进行。从命令状态切换到插入状态的命令参见表。下面是一个经vi 打开的一个文件This is a test最后一行开始处的波折号()表示文件的结尾。打开文件之后,即可适用对文件进行编辑 操作。1.插入文本当 vi 处于插入状态时,才可以插入文本到当前的位置。输入新的文本,只需从键盘输入字符即可。参考表中所列命令。2.删除文
10、本删除单个字符可以使用delete 键或backspace 键。对于复杂的删除命令,可以参考如下的命令列表:命令xnxnXndwddd$或DU说明删除光标处字符(Character)删除光标处后n 个字符删除光标处前n 个字符删除光标处下n 个单词(word)删除整行删除由光标至该行最末恢复前一次所做的删除表2删除文本命令3.替换文本当使用vi 提供丰富的文本替换命令,实现文本的快速修改。表给出了操作命令:命令r charRtextEsccwtextEscC textEscCc说明由char 代替光标处的字符由text 代替光标处的字符由text 取代光标处的单词由text 取代光标处至该行结
11、尾处使整行空白,但保留光标位置,让你开始输入表2-4替换文本命令与删除命令一样,在指令前输入次数,表示执行该指令多少次。4.文本搜索vi还提供了丰富的文本搜索命令,方便用户搜索特定字符串。Vi将搜索整个文件,直至找到与搜索字符串相匹配的文本出现。文本搜索可以通过表所示的一组命令来实现。命令strReturn?strReturn说明向前搜寻str 直至文件结尾处往后搜寻str 直至文件开首处-4-nN同一方向上重复检索相反方向上重复检索表2-文本搜索命令2.3C 语言源程序的编译与链接C 语言源程序的编译与链接由GCC编译器来完成。gcc命令的基本用法格式如下:gcc options filen
12、ames其中filenames 为文件名称;options 为编译选项,说明针对当前文件的编译与链接选项。2.3.1GCC基本选GCC提供的编译选项很多,其中一些选项可能永远都不会用到,但一些主要的选项可能会频繁使用。由于很多的 GCC选项包括一个以上的字符,因此必须为每个选项指定各 自的连字符,并且就象大多数 Linux命令一样你不能在一个单独的连字符后跟一组选项。例如,下面的两个命令是不同的:gcc-p-ghello.c gcc-pg hello.c第一条命令要求 GCC编译 test.c时为 prof命令建立剖析(profile)信息并且把调试信息加入到可执行的文件中。第二条命令只要求G
13、CC为 gprof命令建立剖析信息.。当你不用任何选项编译一个程序时,如果编译成功,GCC将会自动建立一个名为 a.out的可执行文件。例如,下面的命令将在当前目录下产生一个叫a.out的文件:gcc hello.c但是如果使用-o编译选项,则可以为将产生的可执行文件指定一个文件名来代替 a.out.。例如,将一个名为 Test.c的 C程序编译为名叫 Test 的可执行文件,你将输入下面 的命令:gcc-o Test Test.c注意:当你使用-o选项时,-o后面必须跟一个文件名。GCC同样有指定编译器编译步骤的选项。例如:-c选项要求 GCC仅将源代码编译 为目标代码,而跳过汇编和链接的步
14、骤。缺省时GCC将生成的一个 扩展名为.o的目标代 码文件。1)-S选项要求 GCC在将 C程序翻译为汇编语言文件后停止编译。GCC产生的汇编语 言文件的缺省扩展名是.s.。2.3.2GCC 优化选项当你用 GCC编译 C代码时,它会试着用最少的时间完成编译并且使编译后的代码易于调试,易于调试意味着编译后的代码与源代码有同样的执行次序,编译后的代码没有经过优化。有很多选项可用于告诉 GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件这些选项中最典型的是和选项-5-1)-O选项告诉GCC对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2选项告诉 GCC产
15、生尽可能小和尽可能快的代码。2)-O2选项将使编译的速度比使用-O时慢.但通常产生的代码执行速度会更快。除了-O和-O2优化选项外,还有一些低级选项用于产生更快的代码。这些选项非 常的特殊,而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再 去使用。这些选项的详细描述,请参考 GCC的联机帮助,在命令行上键入 man gcc即可。假设我们有下面一个非常简单的源程序(hello.c):#include“stdio.h”void main()printf(Welcome to Linux C World!);要编译这个程序,只要在命令行下执行:$gcc-o hello hell
16、o.c输入如下的命令,即可运行程序并看到结果$./hello运行结果为Welcome to Linux C World!2.3.3GCC 调试选项GCC支持多种调试和剖析选项,其中最常用是-g 选项。-g选项告诉 GCC产生能被 GNU调试器使用的调试信息以便调试你的程序。关于调试 C程序的更多信息请看下一节用 gdb调试 C程序。2.4C 语言源程序的编译调试虽然 GCC提供了调试选项,但是本身不能用于调试。Linux提供了一个名为 gdb的GNU调试程序。gdb是一个用来调试 C和 C+程序的调试器。它使你能在程序运行时 观察程序的内部结构和内存的使用情况。以下是 gdb所提供的一些功能:
17、1)它使你能监视你程序中变量的值;2)它使你能设置断点以使程序在指定的代码行上停止执行;它使你能一行行的执行你的代码。2.4.1GDB 启动在命令行上键入 gdb并按回车键就可以运行 gdb了,如下:$gdb 启动成功,将在屏幕上显示如下类似的内容:GNU gdb 19991004Copyright 1998 Free Software Foundation,Inc.GDB is free software,covered by the GNU General Public License,and you are-6-welcome to change it and/or distribute
18、 copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB.Type show warranty for details.This GDB was configured as i386-redhat-linux.(gdb)当启动 gdb之后,即可在命令行上输入命令进行相关的调试操作。也可以以下面的方式来启动 gdb:$gdb 这种方式启动 gdb,直接将指定调试的程序文件装载到调试环境中。也就是让gdb装入名为 fil
19、ename 的可执行文件,从而准备调试。gdb 还提供了其他的启动选项,请参考gdb 的联机帮助。在命令行上键入 man gdb 并回车即可,如下。$mangdb为了能够进行调试,当前调试的程序文件中必须包含调试信息。其中调试信息包含程序 中的每个变量的类型和其在可执行文件里的地址映射以及源代码的行号,gdb利用这些信息 使源代码和机器码相关联。因此在使用gcc 编译源程序的时候必须使用-g选项,以便将调 试信息包含在可执行文件中。例如,编译上述的hello.c 的过程如下:$gcc-o hello hello.c2.4.2GDB基本命gdb支持很多的命令以实现不同的功能,从简单的文件装入到检
20、查所调用的堆栈内容。表6 列出了在用命令filekilllistnextsteprunquitwatchgdb 调试时经常用到的一些命令。说明装入想要调试的可执行文件终止正在调试的程序列出产生执行文件的源代码的一部分执行一行源代码但不进入函数内部执行一行源代码而且进入函数内部执行当前被调试的程序退出 gdb使你能监视一个变量的值而不管它何时被改变在代码里设置断点,这将使程序执行到这里 时被挂起breakmake使你能不退出文件gdb就可以重新产生可执行shell使你能不离开 gdb就执行表基本db命令UNIX shell命令应用举例2.5本节用一个简单的实例讲解应用 gdb调试程序的基本步骤。
21、-7-首先利用vi 编辑建立名为test.c 的程序文件。命令如下:$vi test.c此时在当前的目录下建立名为test.c 的文本文件。接下来,在vi 编辑环境中使用命令输入如下的程序代码:#include stdio.h#include string.hvoid GetTitle(char*pszText)char szText=This is a Test C Program!n;strcpy(pszText,szText);void PrintTitle(char*pszText)unsigned int n,i;char a;n=strlen(pszText);for(i=0;in
22、;i+)a=pszTexti;printf(%c,a);intmain()int a;char szTitle255;a=20;GetTitle(szTitle);PrintTitle(szTitle);printf(A=%d,a);return 0;在程序编写完成之后,vi 编辑环境中按下Esc 键,并输入:wq 命令,将当前的修改存盘并退出vi 编辑环境。用下面的命令编译test.c,以便生成调试信息,准备调试。执行如下的命令$gcc-g-otesttest.c启动gdb 并加载test$gdb test 系统将显示如下的信息GNU gdb 19991004Copyright 1998 F
23、ree Software Foundation,Inc.GDB is free software,covered by the GNU General Public License,and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.-8-There is absolutely no warranty for GDB.Type show warranty for details.This GD
24、B was configured as i386-redhat-linux.首先运行一下程序,大致看一下结果:(gdb)run 系统将显示如下的信息 Startingprogram:/a.out This is aTest C Program!A=20Program exited normally.接下来执行list 命令,查看程序的代码,主要是查看代码的行号。(gdb)list 0系统将显示如下的信息123456789#include stdio.h#include string.hvoid GetTitle(char*pszText)char szText=This is a Test C
25、 Program!n;strcpy(pszText,szText);void PrintTitle(char*pszText)unsigned int n,i;由于屏幕有限,因此仅仅显示了10 行代码,查看下面的10 行代码,在此输入list 命令即可。(gdb)list系统将显示如下的信息111213141516171819char a;n=strlen(pszText);for(i=0;in;i+)a=pszTexti;printf(%c,a);intmain()接下来,再次输入list 命令,显示剩余的代码。(gdb)list系统将显示如下的信息:2122232425int a;char
26、 szTitle255;a=20;GetTitle(szTitle);PrintTitle(szTitle);-9-26printf(A=%d,a);27return 0;为了查看在程序在PrintTitle 函数中的循环体的运行情况,将断点设置在15 行,以便观察变量a 的变化。因此输入命令(gdb)break 15系统将显示如下的信息Breakpoint 1 at 0 x80484a0:file test.c,line 15.接下来使用run 命令运行程序,(gdb)run 系统将显示如下的信息 Startingprogram:/a.outBreakpoint 1,PrintTitle(p
27、szText=0 xbffff8b4 This is a Test C Program!n)at test.c:15a=pszTexti;提示信息说明程序运行到断点位置停了下来,此时可以通过 watch容。下面查看变量a 的内容的变化情况,输入如下的命令:(gdb)watch a 系统将显示如下的设置成功信息 Hardwarewatchpoint 2:a 输入下面的指令,运行下一步。(gdb)next系统将显示变量a 的变化情况Hardware watchpoint 2:a命令查看变量的内Old value=111 oNew value=84 TPrintTitle(pszText=0 xbf
28、fff8b4 This is a Test C Program!n)at test.c:16printf(%c,a);再次执行next 命令查看下一步的结果。(gdb)next系统将显示如下信息#01613PrintTitle(pszText=0 xbffff8b4 This is a Test C Program!n)at test.c:16printf(%c,a);for(i=0;in;i+)再次执行next 命令。(gdb)next系统将显示如下信息#0PrintTitle(pszText=0 xbffff8b4 This is a Test C Program!n)at test.c:
29、1313for(i=0;in;i+)-10-Breakpoint 1,PrintTitle(pszText=0 xbffff8b4 This is a Test C Program!n)at test.c:15a=pszTexti;结束调试,输入如下quit 命令(gdb)quit系统提示如下的信息。The program is running.Exit anyway?(y or n)由于当前的程序正在运行,所以提示用户是否要退出,输入y 后,即可强制结束调试过程,并退出gdb 调试环境。由于程序已经没有问题,执行如下命令建立不包括调试信息的发行版本的可执行文件。命令如下:$gcc-otesttest.c形成名为 test的可执行文件,此文件不包括调试信息,因此本身比较小,并且代码的执行效率比较高。Linux 系统下如何编辑、编译/链接、调试、运行程序的基本步骤就简单的介绍完了。下一步的工作是熟练掌握基本的命令,并参考联机帮助进一步的学习。下面总结一下如何获得相关的帮助。在Linux 系统某个命令的联机帮助是通过如下命令获得:$man命令。例如,获得上述几个命令的联机帮助的命令如下:$man gcc获得gcc 的相关帮助可以使用如下的命令;$man gdb获得gdb 的相关帮助可以使用如下的命令;获得vi 的相关帮助可以使用如下的命令。$man vi-11-
限制150内