第12节Linux编程环境与开发工具.ppt

上传人:qwe****56 文档编号:70015451 上传时间:2023-01-14 格式:PPT 页数:65 大小:338.50KB
返回 下载 相关 举报
第12节Linux编程环境与开发工具.ppt_第1页
第1页 / 共65页
第12节Linux编程环境与开发工具.ppt_第2页
第2页 / 共65页
点击查看更多>>
资源描述

《第12节Linux编程环境与开发工具.ppt》由会员分享,可在线阅读,更多相关《第12节Linux编程环境与开发工具.ppt(65页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、LinuxLinux基础基础Linux编程环境与开发工具编程环境与开发工具大理学院数学与计算机学院大理学院数学与计算机学院硬件教研室硬件教研室赵贵文赵贵文第十 节教学目的和要求教学目的和要求 学会学会GNU风格与风格与Linux内核编程风格内核编程风格了解了解GCC及及执行过程及及执行过程掌握使用掌握使用GNUmake编辑编辑makefile文件文件了解了解GDB命令的基本使用命令的基本使用学会如何创建一个学会如何创建一个shell脚本程序脚本程序掌握掌握shell程序的基本语法结构与应用程序的基本语法结构与应用shell的基本语句的基本语句掌握掌握LinuxC语言的基本编程思想与基本语言的基

2、本编程思想与基本框架、编译过程框架、编译过程第十 节重点内容重点内容 GCC及及执行过程及及执行过程GNUmake编辑编辑makefile文件文件LinuxC语言的基本编程思想与基本框语言的基本编程思想与基本框架、编译过程架、编译过程第十 节Linux编程编程 Linux软件开发一直在软件开发一直在Internet环境下环境下讲讲行。这个环境是行。这个环境是全球性全球性的,编程人员来自世界的,编程人员来自世界各地。只要能够访问各地。只要能够访问Web站点,就可以启动一站点,就可以启动一个以个以Linux为基础的软件项目。为基础的软件项目。Linux开发工开发工作经常是在作经常是在Linux用户

3、决定共同完成一个项目用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放时开始的。当开发工作完成后,该软件就被放到到Internet站点上,站点上,任何用户都可以访问和下任何用户都可以访问和下载它载它。由于这个活跃的开发环境,新的以。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现为基础的软件功能日益强大,而且呈现爆炸式的增长态势。爆炸式的增长态势。第十 节Linux编程编程 大多数大多数Linux软件是经过软件是经过自由软件基金会自由软件基金会(FreeSoftwareFoundation)提供的)提供的GNU(GNU即即GNUsnotUNIX)公开)公

4、开认证授权的,因而通常被称作认证授权的,因而通常被称作GNU软件。软件。GNU软件软件免费免费提供给用户使用,并被证明提供给用户使用,并被证明是非常可靠和高效的。许多流行的是非常可靠和高效的。许多流行的Linux实用程序如实用程序如C编译器、编译器、shell和编辑器都是和编辑器都是GNU软件应用程序。软件应用程序。Linux程序需要首先转化为程序需要首先转化为低级机器语言低级机器语言即所谓的即所谓的二进制代码二进制代码以后,才能被操作系以后,才能被操作系统执行。统执行。第十 节GNU计划的实用程序计划的实用程序GNU(它代表它代表GNUisnotUNIX)是由是由Richardstallma

5、n开发的一个与开发的一个与UNIX兼兼容的软件系统。容的软件系统。GNU软件免费提供给用软件免费提供给用户使用,并被证明是非常户使用,并被证明是非常可靠可靠和和高效高效的。的。GNU计划包括计划包括上百个命令、工具和上百个命令、工具和工具的集合,以及文档工具的集合,以及文档。可以说如果没。可以说如果没有上百位的编程者用他们的时间和精力有上百位的编程者用他们的时间和精力开发这些程序,开发这些程序,RedHatLinux不会像现不会像现在拥有这么丰富的内容。在拥有这么丰富的内容。第十 节GNU计划软件内容计划软件内容GNU计划的实用程序分布在多计划的实用程序分布在多个部分中。个部分中。bin实用程

6、序、实用程序、diff实用实用程序以及程序以及shar(shellarchive)实用实用程序主要用于开发工作;最常用的程序主要用于开发工作;最常用的实用程序是实用程序是文件实用程序、查找实文件实用程序、查找实用程序、用程序、shell实用程序以及文本实用程序以及文本实用程序实用程序。第十 节GNU风格风格(1)函数)函数返回类型说明返回类型说明和和函数名函数名分两行放置,函数分两行放置,函数起始字符起始字符和函数和函数开头开头左花括号放到最左边。左花括号放到最左边。(2)尽量不要让两个)尽量不要让两个不同优先级不同优先级的操作符出现在相的操作符出现在相同的对齐方式中,应该附加额外的括号使得代

7、码缩进同的对齐方式中,应该附加额外的括号使得代码缩进可以表示出嵌套。可以表示出嵌套。(3)每个程序都应该以一段简短的说明其功能的)每个程序都应该以一段简短的说明其功能的注注释开头释开头。(4)请为)请为每个函数书写注释每个函数书写注释,说明函数是做什么的,说明函数是做什么的,需要哪些入口参数,参数可能值的含义和用途。如果需要哪些入口参数,参数可能值的含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不用了非常见的、非标准的东西,或者可能导致函数不能工作的任何可能的值,应该进行能工作的任何可能的值,应该进行特殊说明特殊说明。如果存。如果存在重要的返回值,也需要说明。在重要的返回值,也需

8、要说明。第十 节GNU风格风格(5)不要声明多个变量时跨行,)不要声明多个变量时跨行,每一行都以一个新的每一行都以一个新的声明开头声明开头。(6)当一个)当一个if中嵌套了另一个中嵌套了另一个if-else时,应用时,应用花括号花括号把把if-else括起来。括起来。(7)要在同一个声明中同时说明结构标识和变量或者)要在同一个声明中同时说明结构标识和变量或者结构标识和类型定义结构标识和类型定义(typedef)。先定义变量,再使用先定义变量,再使用。(8)尽量避免在)尽量避免在if的条件中进行赋值。的条件中进行赋值。(9)请在名字中使用下划线以分割单词,尽量使用)请在名字中使用下划线以分割单词

9、,尽量使用小小写写;把;把大写字母留给宏和枚举常量大写字母留给宏和枚举常量,以及根据统一惯例,以及根据统一惯例使用的前缀。例如,应该使用类似使用的前缀。例如,应该使用类似ignore_space_change_flag的名字;不要使用类似的名字;不要使用类似iCantReadThis的名字。的名字。(10)用于表明一个命令行选项是否给出的变量应该)用于表明一个命令行选项是否给出的变量应该在选项含义的说明之在选项含义的说明之后后,而不是选项字符之后被命名。,而不是选项字符之后被命名。第十 节Linux 内核编程风格内核编程风格(1)Linux内核缩进风格是内核缩进风格是8个字符。个字符。(2)L

10、inux内核风格采用内核风格采用K&R标准,将开始的标准,将开始的大括号放在一行的最后,而将结束的大括号放在大括号放在一行的最后,而将结束的大括号放在一行的第一位一行的第一位。(3)命名尽量简洁。不应该使用诸如)命名尽量简洁。不应该使用诸如ThisVariableIsATemporaryCounter之类的名字。之类的名字。应该命名为应该命名为tmp,这样容易书写,也不难理解。,这样容易书写,也不难理解。但是命名全局变量,就应该用描述性命名方式,但是命名全局变量,就应该用描述性命名方式,例如应该命名例如应该命名“count_active_users()”,而不是,而不是“cntusr()”。本

11、地变量应该避免过长本地变量应该避免过长。第十 节Linux 内核编程风格内核编程风格(4)函数最好短小精悍,一般来说不要让)函数最好短小精悍,一般来说不要让函数的参数多于函数的参数多于10个,否则应该尝试分解这个个,否则应该尝试分解这个过于复杂的函数。过于复杂的函数。(5)通常情况,注释说明代码的)通常情况,注释说明代码的功能功能,而而不是其实现原理不是其实现原理。避免把注释插到函数体内,。避免把注释插到函数体内,而写到函数前面,说明其功能,如果这个函数而写到函数前面,说明其功能,如果这个函数的确很复杂,其中需要有部分注释,可以写些的确很复杂,其中需要有部分注释,可以写些简短的注释来说明那些重

12、要的部分,但是不能简短的注释来说明那些重要的部分,但是不能过多。过多。第十 节编程环境编程环境各种编程语言或各种编程语言或shell程序脚本的源代码文件程序脚本的源代码文件可以用任何一种文本编辑器打开和编辑。一般可以用任何一种文本编辑器打开和编辑。一般来说,在来说,在Linux开发程序有两个主要的编辑器开发程序有两个主要的编辑器vi或者或者vim,还有,还有Emacs。这些文本编辑器如。这些文本编辑器如何选择?可以都试试看,然后选择自己喜欢的何选择?可以都试试看,然后选择自己喜欢的.反正它们都可以输入文本,都可以生成源代码反正它们都可以输入文本,都可以生成源代码.第十 节GCC简介简介Linu

13、x系统下的系统下的GCC(GNUCCompiler)是是GNU推出的功能强大、性能优越的推出的功能强大、性能优越的多平台编译多平台编译器器,是,是GNU的代表作品之一。的代表作品之一。GCC是可以在是可以在多种硬体平台上编译出可执行程序的多种硬体平台上编译出可执行程序的超级编译超级编译器器,其执行效率与一般的编译器相比平均效率,其执行效率与一般的编译器相比平均效率要高要高20%30%。GCC这个编译器稳定,而且文档齐全,大部这个编译器稳定,而且文档齐全,大部分的自由软件都是用他编译的。如果使用分的自由软件都是用他编译的。如果使用C,那么就可以选择那么就可以选择GCC。本节主要介绍这种编译。本节

14、主要介绍这种编译器的基本原理和使用方法,以及编译过程中所器的基本原理和使用方法,以及编译过程中所产生的错误的原因及对策。产生的错误的原因及对策。第十 节GCC的执行过程的执行过程虽然称虽然称GCC是是C语言的编译器,但使用语言的编译器,但使用GCC由由C语言语言源代码文件生成可执行文件的过程不仅仅是编译的过源代码文件生成可执行文件的过程不仅仅是编译的过程,而且要经历程,而且要经历4个相互关联的步骤:个相互关联的步骤:预处理预处理(也称预也称预编译,编译,preprocessing)、编译编译(compilation)、汇编汇编(assembly)和和链接链接(linking)。gcc可以使程序

15、员灵活地控制编译过程。编译过程一可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,如图所示。工具进行处理,如图所示。预处理预处理链接链接编译编译组译组译源程序源程序(*.c)(*.c)可执行文件可执行文件预处理器预处理器编译器编译器组译器组译器连接器连接器第十 节gcc的版本信息的版本信息一般来说,系统安装后就已经安装和设定好了一般来说,系统安装后就已经安装和设定好了gcc。在在shell的提示符下键入的提示符下键入gccv,屏幕上就会显示出目,屏幕上就会显示出目前正在使用的前正在使用的gcc的版

16、本,同时这可以确定系统所支的版本,同时这可以确定系统所支持的是持的是ELF还是还是a.out可执行文件格式。可执行文件格式。Linux系统中可执行文件有两种格式。第一种格式是系统中可执行文件有两种格式。第一种格式是a.out格式,这种格式用于早期的格式,这种格式用于早期的Linux系统以及系统以及Unix系统的原始格式。系统的原始格式。a.out来自于来自于UnixC编译程序默认的编译程序默认的可执行文件名。当使用共享库时,可执行文件名。当使用共享库时,a.out格式就会发生格式就会发生问题。把问题。把a.out格式调整为共享库是一种非常复杂的操格式调整为共享库是一种非常复杂的操作,由于这个原

17、因,一种新的文件格式被引入作,由于这个原因,一种新的文件格式被引入Unix系系统统5的第四版本和的第四版本和Solaris系统中。它被称为系统中。它被称为可执行和可执行和连接连接的格式(的格式(ELF)。这种格式很容易实现共享库。)。这种格式很容易实现共享库。第十 节gcc的使用的使用在使用在使用GCC编译器的时候,必须给出一系列必要的编译器的时候,必须给出一系列必要的调用参数和文件名称。调用参数和文件名称。GCC编译器的调用参数大约有编译器的调用参数大约有100多个,其中多数参数可能根本就用不到,这里只多个,其中多数参数可能根本就用不到,这里只介绍其中介绍其中最基本、最常用最基本、最常用的参

18、数。的参数。gcc的使用格式如下:的使用格式如下:$gccoptionsfilenames其中其中filenames为所要编译的程序源文件。为所要编译的程序源文件。当使用当使用gcc时,时,gcc会完成会完成预处理、编译、汇编和连预处理、编译、汇编和连接接。前三步分别生成。前三步分别生成目标文件目标文件,连接时,把生成的目,连接时,把生成的目标文件链接成标文件链接成可执行文件可执行文件。gcc可以针对支持不同的可以针对支持不同的源程序文件进行不同处理,文件格式以文件的后缀来源程序文件进行不同处理,文件格式以文件的后缀来识别。识别。第十 节使用优化选项使用优化选项当用当用gcc编译编译C代码时,

19、它会试着用最少的时代码时,它会试着用最少的时间完成编译并且使编译后的代码易于调试间完成编译并且使编译后的代码易于调试.易于易于调试意味着编译后的代码与源代码有同样的执行调试意味着编译后的代码与源代码有同样的执行次序,编译后的代码没有经过优化。有很多选项次序,编译后的代码没有经过优化。有很多选项可用于告诉可用于告诉gcc,在,在耗费更多编译时间和牺牲易耗费更多编译时间和牺牲易调试性的基础调试性的基础上,产生更小更快的可执行文件。上,产生更小更快的可执行文件。这些选项中最典型的是这些选项中最典型的是-O和和-O2选项。选项。-O选项告诉选项告诉gcc对源代码进行对源代码进行基本优化基本优化。-O2

20、选项告诉选项告诉gcc产生产生尽可能小和尽可能快尽可能小和尽可能快的代的代码。码。-O2选项将使编译的选项将使编译的速度速度比使用比使用-O时时慢慢。但。但通常产生的通常产生的代码执行速度会更快代码执行速度会更快。第十 节使用调试和剖析选项使用调试和剖析选项GCC支持数种支持数种调试调试和和剖析剖析选项。在这些选项选项。在这些选项里最常用的是里最常用的是-g和和-pg选项。选项。-g选项告诉选项告诉gcc产生能被产生能被GNU调试器使用的调试器使用的调调试信息试信息以便调试程序。以便调试程序。gcc提供了一个很多其提供了一个很多其他他C编译器里没有的特性,在编译器里没有的特性,在gcc里能使里

21、能使-g和和-O(产生优化代码产生优化代码)连用。这一点非常有用,因为能连用。这一点非常有用,因为能在与最终产品尽可能相近的情况下调试代码。在与最终产品尽可能相近的情况下调试代码。同时使用这两个选项时必须清楚所写的某些代同时使用这两个选项时必须清楚所写的某些代码已经在优化时被码已经在优化时被gcc作了改动。作了改动。-pg选项告诉选项告诉gcc在程序里加入额外的代码,在程序里加入额外的代码,执行时,产生执行时,产生gprof用的剖析信息以显示用的剖析信息以显示程序的程序的耗时耗时情况。情况。第十 节GNU make的介绍的介绍make是所有想在是所有想在Unix/Linux系统上系统上编程的用

22、户必须掌握的工具。如果写的编程的用户必须掌握的工具。如果写的程序中没有用到程序中没有用到make,则说明写的程,则说明写的程序还只是个人的练习程序,不具有任何序还只是个人的练习程序,不具有任何实用的价值。也许这么界定过于严格,实用的价值。也许这么界定过于严格,但在任何稍具规模的程序中的确定应用但在任何稍具规模的程序中的确定应用到到make。第十 节使用使用GNU make编辑编辑makefile准备工作准备工作n要使用要使用make,必须编写一个叫做,必须编写一个叫做Makefile的文件,的文件,这个文件描述了软件包中文件之间的关系,提供更这个文件描述了软件包中文件之间的关系,提供更新每个文

23、件的命令。一般在一个软件包里,通常是新每个文件的命令。一般在一个软件包里,通常是可执行文件靠目标文件来更新,可执行文件靠目标文件来更新,目标文件靠编译源目标文件靠编译源文件来更新文件来更新。nMakefile写好之后,每次改变了某些源文件,只要写好之后,每次改变了某些源文件,只要执行执行make命令:命令:#maken所有必要的重新编译将执行。所有必要的重新编译将执行。Make程序利用程序利用makefile中的数据和每个文件的中的数据和每个文件的最后修改时间最后修改时间来确来确定那个文件需要更新,对于需要更新的文件,定那个文件需要更新,对于需要更新的文件,make程序执行程序执行makefi

24、le数据中定义的命令来更新。数据中定义的命令来更新。第十 节使用使用GNU make编辑编辑makefilemakefile文件的基本结构文件的基本结构GNUmake的主要功能是的主要功能是读读进一个文本文件进一个文本文件makefile并根据并根据makefile的内容执行一系列的工作。的内容执行一系列的工作。makefile的的默认文件名为默认文件名为GNUmakefile、makefile或或Makefile,当然也可以在当然也可以在make的命令行中指定别的文件名。如果的命令行中指定别的文件名。如果不特别指定,不特别指定,make命令在执行时将按命令在执行时将按顺序顺序查找默认的查找默

25、认的makefile文件。多数文件。多数Linux程序员使用第三种文件名程序员使用第三种文件名Makefile。因为。因为第一个字母是大写第一个字母是大写,通常被列在一个目,通常被列在一个目录的文件列表的录的文件列表的最前面最前面。Makefile是一个是一个文本形式文本形式的的数据库文件数据库文件,其中包含一,其中包含一些规则来告诉些规则来告诉make处理哪些文件以及如何处理这些文处理哪些文件以及如何处理这些文件。这些规则主要是描述哪些文件(称为件。这些规则主要是描述哪些文件(称为target目标文目标文件,不要和编译时产生的目标文件相混淆)是从哪些别件,不要和编译时产生的目标文件相混淆)是

26、从哪些别的文件(称为的文件(称为dependency依赖文件)中产生的,以及依赖文件)中产生的,以及用什么命令(用什么命令(command)来执行这个过程。)来执行这个过程。第十 节使用使用GNU make编辑编辑makefile一个一个Makefile文件主要含有一系列的规则,每条规则文件主要含有一系列的规则,每条规则包含以下内容。包含以下内容。n一个目标(一个目标(target),),即即make最终需要创建的文最终需要创建的文件,如可执行文件和目标文件;目标也可以是要件,如可执行文件和目标文件;目标也可以是要执行的动作,如执行的动作,如“clean”。n一个或多个依赖文件(一个或多个依赖

27、文件(dependency)列表)列表,通,通常是编译目标文件所需要的其他文件。常是编译目标文件所需要的其他文件。n一系列命今一系列命今(command),是,是make执行的执行的动作动作,通常是把指定的相关文件编译成目标文件的编译通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字命令,每个命令占一行,且每个命令行的起始字符必须为符必须为TAB字符。字符。除非特别指定除非特别指定,否则否则make的工作目录就是的工作目录就是当前目录当前目录。target是需要创建的二进制文件或目标文件,是需要创建的二进制文件或目标文件,dependency是在创建是在创建t

28、arget时需要用到的一个或多个时需要用到的一个或多个文件的列表,命令序列是创建文件的列表,命令序列是创建target文件所需要执行的文件所需要执行的步骤,比如编译命令。步骤,比如编译命令。第十 节使用使用GNU make编辑编辑makefileMakefile规则的一般形式如下:规则的一般形式如下:target:dependencydependency(tab)例如,有以下的例如,有以下的Makefile文件:文件:#一个简单的一个简单的Makefile的例子的例子#以以#开头的为注释行开头的为注释行test:prog.ocode.ogccotestprog.ocode.oprog.o:pr

29、og.cprog.hcode.hgcccprog.coprog.ocode.o:code.ccode.hgccccode.cocode.oclean:rmf*.o第十 节使用使用GNU make编辑编辑makefile一般情况下,调用一般情况下,调用make命令可输入:命令可输入:#maketargettarget是是Makefile文件中定义的目标之文件中定义的目标之一,如果省略一,如果省略target,make就将生成就将生成Makefile文件中定义的第一个目标。对于文件中定义的第一个目标。对于上面上面Makefile的例子,单独的一个的例子,单独的一个“make”命令等价于:命令等价于

30、:#maketest第十 节使用使用GNU make编辑编辑makefile现在来看一下现在来看一下make做的工作:首先做的工作:首先make按按顺顺序读取序读取makefile中的规则中的规则,然后检查该规则中,然后检查该规则中的的依赖文件与目标文件的时间戳依赖文件与目标文件的时间戳哪个更新,如哪个更新,如果目标文件的时问戳比依赖文件还早,就按规果目标文件的时问戳比依赖文件还早,就按规则中定义的命令更新目标文件。如果该规则中则中定义的命令更新目标文件。如果该规则中的依赖文件又是其他规则中的目标文件,那么的依赖文件又是其他规则中的目标文件,那么依照规则链不断执行这个过程,直到依照规则链不断执

31、行这个过程,直到Makefile文文件的结束,至少可以找到一个不是规则生成的件的结束,至少可以找到一个不是规则生成的最终依赖文件,获得此文件的时间戳,然后最终依赖文件,获得此文件的时间戳,然后从从下到上下到上依照规则链执行目标文件的时间戳比此依照规则链执行目标文件的时间戳比此文件时间戳旧的规则,直到文件时间戳旧的规则,直到最顶层最顶层的规则。的规则。第十 节使用使用GNU make编辑编辑makefile通过以上的分析过程通过以上的分析过程,可以看到可以看到make的的优点优点,因为因为.o目标文件依赖目标文件依赖.c源文件,源码文件里一源文件,源码文件里一个简单改变都会造成那个文件被重新编译

32、,并个简单改变都会造成那个文件被重新编译,并根据规则链依次根据规则链依次由下到上由下到上执行编译过程,直到执行编译过程,直到最终的可执行文件被重新连接。例如,当改变最终的可执行文件被重新连接。例如,当改变一个头文件的时候,由于所有的依赖关系都在一个头文件的时候,由于所有的依赖关系都在Makefile里,因此不再需要记住依赖此头文件里,因此不再需要记住依赖此头文件的所有源码文件,的所有源码文件,make可以自动的重新编译可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接。件,如果需要,再进行重新连接。第十 节Makefi

33、le中的变量中的变量Makefile里的变量就像一个里的变量就像一个环境变量环境变量。事实。事实上,环境变量在上,环境变量在make中也被解释成中也被解释成make的变的变量。这些变量对量。这些变量对大小写大小写敏感,一般使用敏感,一般使用大写宇大写宇母母。几乎可以从任何地方引用定义的变量,变。几乎可以从任何地方引用定义的变量,变量的主要作用如下:量的主要作用如下:n保存文件名列表。保存文件名列表。n保存可执行命令名,如编译器。保存可执行命令名,如编译器。n保存编译器的参数。保存编译器的参数。第十 节Makefile中的变量中的变量Makefile中的变量是用一个中的变量是用一个文本串文本串在

34、在Makefile中定义中定义的,这个文本串就是的,这个文本串就是变量的值变量的值。只要在一行的开始写下。只要在一行的开始写下这个变量的名字,后面跟一个这个变量的名字,后面跟一个“”号,以及要设定这个号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:变量的值即可定义变量,下面是定义变量的语法:VARNAME=string使用时,把变量用使用时,把变量用括号括号括起来,并在前面加上括起来,并在前面加上$符号,符号,就可以就可以引用变量引用变量的值:的值:$VARNAMEmake解释规则时,解释规则时,VARNAME在等式在等式右端右端展开为定义展开为定义它的字符串。变量一般都在它的字

35、符串。变量一般都在Makefile的头部定义。按照的头部定义。按照惯例,所有的惯例,所有的Makefile变量都应该是变量都应该是大写大写。如果变量的。如果变量的值发生变化,就只需要在一个地方修改,从而简化了值发生变化,就只需要在一个地方修改,从而简化了Makefile的维护。的维护。第十 节Makefile中的变量中的变量现在利用变量把前面的现在利用变量把前面的Makefile重写一遍:重写一遍:OBJS=prog.ocode.oCC=gcctest:$OBJS$CCotest$OBJSprog.o:prog.cprog.hcode.h$CCcprog.coprog.ocode.o:code

36、.ccode.h$CCccode.cocode.oclean:rmf*.o第十 节Makefile中的变量中的变量除用户自定义的变量外,除用户自定义的变量外,make还允许使用还允许使用环境变环境变量量、自动变量自动变量和和预定义变量预定义变量。使用环境变量的方法。使用环境变量的方法很简单,在很简单,在make启动时,启动时,make读取系统当前已定读取系统当前已定义的环境变量,并且创建与之同名同值的变量,因义的环境变量,并且创建与之同名同值的变量,因此用户可以像在此用户可以像在shell中一样在中一样在Makefile中方便的引中方便的引用环境变量。需要注意的是,如果用户在用环境变量。需要注

37、意的是,如果用户在Makefile中定义了中定义了同名同名的变量,用户自定义变量将的变量,用户自定义变量将覆盖同名覆盖同名的环境变量的环境变量。此外,。此外,Makefile中还有一些预定义变中还有一些预定义变量和自动变量量和自动变量,但是看起来并不像自定义变量那样直但是看起来并不像自定义变量那样直观。观。除了自动变量外,除了自动变量外,Makefile中还有一些预定义的中还有一些预定义的内部变量,用于定义内部变量,用于定义编译命令名编译命令名、编译参数编译参数等。等。第十 节Makefile的隐含规则的隐含规则在上面的例子中,几个产生目标文件的命令在上面的例子中,几个产生目标文件的命令都是从

38、都是从“.c”的的C语言源文件语言源文件和相关文件通过编译和相关文件通过编译产生产生“.o”目标文件目标文件,这也是一般的步骤。实际,这也是一般的步骤。实际上,上,make可以使工作更加自动化,也就是说,可以使工作更加自动化,也就是说,make知道一些默认的动作,它有一些称作知道一些默认的动作,它有一些称作隐含隐含规则规则的的内置内置的规则,这些规则告诉的规则,这些规则告诉make当用户当用户没有完整地给出某些命令的时候,应该怎样执没有完整地给出某些命令的时候,应该怎样执行。行。第十 节Makefile的隐含规则的隐含规则例如,把生成例如,把生成prog.o和和code.o的命令从规则中删除,

39、的命令从规则中删除,make将会查找隐含规则,然后会找到并执行一个适当将会查找隐含规则,然后会找到并执行一个适当的命令。由于这些命令会使用一些变量,因此可以通过的命令。由于这些命令会使用一些变量,因此可以通过改变这些变量来定制改变这些变量来定制make。象在前面的例子中所定义。象在前面的例子中所定义的那样,的那样,make使用变量使用变量CC来定义编译器,并且传递变来定义编译器,并且传递变量量CFLAGS(编译器参数)、(编译器参数)、CPPFLAGS(C语言预语言预处理器参数)、处理器参数)、TARGET_ARCH(目标机器的结构定(目标机器的结构定义)给编译器,然后加上参数义)给编译器,然

40、后加上参数-c,后面跟变量,后面跟变量$(第一(第一个依赖文件名),然后是参数个依赖文件名),然后是参数-o加变量加变量$(目标文件(目标文件名)。综上所述,一个名)。综上所述,一个C编译的具体命令将会是:编译的具体命令将会是:$CC$CFLAGS$CPPFLAGS$TARGET_ARCHc$-o$第十 节Makefile的隐含规则的隐含规则在上面的例子中,利用隐含规则,可以简化在上面的例子中,利用隐含规则,可以简化为:为:OBJS=prog.ocode.oCC=gcctest:$OBJS$CCo$prog.o:prog.cprog.hcode.hcode.o:code.ccode.hclea

41、n:rmf*.o第十 节使用使用automake和和autoconf产生产生Makefile在开始使用在开始使用Automake和和autoconf之前,请先之前,请先确认系统已经安装以下的软件:确认系统已经安装以下的软件:GNUAutomakeGNUAutoconfGNUm4PerlGNULibtool(如果你需要产生如果你需要产生sharedlibrary)第十 节Automake所产生的所产生的Makefile除了可以做除了可以做到程序的到程序的编译编译和和连接连接,也已经把如何产生程序,也已经把如何产生程序文件的操作,以及把安装程序都考虑进去了,文件的操作,以及把安装程序都考虑进去了,

42、所以源程序所存放的目录架构最好符合所以源程序所存放的目录架构最好符合GNU的的标准惯例,下面用标准惯例,下面用hello.c来作为例子进行说来作为例子进行说明。明。在工作目录下建立一个新的子目录在工作目录下建立一个新的子目录devel,再在再在devel下建立一个下建立一个hello的子目录,这个目的子目录,这个目录将作为存放录将作为存放hello这个程序及其相关文件的这个程序及其相关文件的地方:地方:用编辑器写个用编辑器写个hello.c文件:文件:使用使用automake和和autoconf产生产生Makefile第十 节#includeintmain(intargc,char*argv)

43、printf(Hello,GNU!n);return0;使用使用automake和和autoconf产生产生Makefile第十 节接下来就要使用接下来就要使用Autoconf及及Automake来来产生产生Makefile文件,步骤如下:文件,步骤如下:(1)autoscan产生一个产生一个configure.in的模的模板,执行板,执行autoscan后会产生一个后会产生一个configure.scan的文件,可以用它做为的文件,可以用它做为configure.in文件的模板:文件的模板:(2)编辑)编辑configure.scan文件,如下所示,文件,如下所示,并且把文件名改成并且把文件

44、名改成configure.in(3)执行)执行aclocal和和autoconf,分别会产生,分别会产生aclocal.m4及及configure两个文件:两个文件:使用使用automake和和autoconf产生产生Makefile第十 节(4)编辑)编辑Makefile.am文件,内容如下:文件,内容如下:(5)执行)执行automake-add-missing,Automake会根据会根据Makefile.am产生一些文件,包含最重要的产生一些文件,包含最重要的Makefile.in:(6)最后执行)最后执行./configure:现在你的目录下已经产生了一个现在你的目录下已经产生了一个

45、Makefile文件,执文件,执行行make命令就可以开始编译命令就可以开始编译hello.c成执行文件,最成执行文件,最后执行后执行./hello:#makegcc-DPACKAGE=hello-DVERSION=1.0-I.-I.-g-O2-chello.cgcc-g-O2-ohellohello.o#./helloHello!GNU!使用使用automake和和autoconf产生产生Makefile第十 节GDB调试器简介调试器简介Linux系统中包含了系统中包含了GNU调试程序调试程序gdb,它,它是一个用来调试是一个用来调试C和和C+程序的调试器。可以程序的调试器。可以使程序开发者

46、在程序运行时观察程序的内部结使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。构和内存的使用情况。gdb所提供的一些功能所提供的一些功能如下所示:如下所示:n运行程序,设置所有的能影响程序运行的参数和运行程序,设置所有的能影响程序运行的参数和环境;环境;n控制程序在指定的条件下停止运行;控制程序在指定的条件下停止运行;n当程序停止时,可以检查程序的状态;当程序停止时,可以检查程序的状态;n修改程序的错误,并重新运行程序;修改程序的错误,并重新运行程序;n动态监视程序中变量的值;动态监视程序中变量的值;n可以单步执行代码,观察程序的运行状态。可以单步执行代码,观察程序的运行状态。第十

47、节GDB调试器简介调试器简介gdb的功能非常强大,到目前为止,的功能非常强大,到目前为止,gdb已能够支持已能够支持Moduls-2、Chill、Pascal和和FORTRAN程序的调试,程序的调试,但是调试这些语言的源程序时有一些功能还不能使用。但是调试这些语言的源程序时有一些功能还不能使用。例如调试例如调试FORTRAN程序时还不支持表达式的输入、输程序时还不支持表达式的输入、输出变量或类出变量或类FORTRAN的词法。的词法。gdb程序调试的对象是程序调试的对象是可执行文件可执行文件,而不是程序的源,而不是程序的源代码文件。然而,并不是所有的可执行文件都可以用代码文件。然而,并不是所有的

48、可执行文件都可以用gdb调试。如果要让产生的可执行文件可以用来调试,调试。如果要让产生的可执行文件可以用来调试,需在执行需在执行gcc指令编译程序时,加上指令编译程序时,加上-g参数,指定程序参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行量的类型和在可执行文件里的地址映射以及源代码的行号。号。gdb利用这些信息使源代码和机器码相关联。利用这些信息使源代码和机器码相关联。第十 节GDB调试器简介调试器简介在命令行上输入在命令行上输入gdb并按回车键就可以运行并按回车键就可以运行gdb了

49、,如果了,如果一切正常的话,将启动一切正常的话,将启动gdb,可以在屏幕上看到以下的内,可以在屏幕上看到以下的内容:容:GNUgdbRedHatLinux(5.3post-0.20021129.18rh)Copyright2003FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Typeshowcopyingtoseethecondit

50、ions.ThereisabsolutelynowarrantyforGDB.Typeshowwarrantyfordetails.ThisGDBwasconfiguredasi386-redhat-linux-gnu.(gdb)第十 节GDB调试器简介调试器简介启动启动gdb后,可以在命令行上指定很多的选项。输入:后,可以在命令行上指定很多的选项。输入:help可以获得可以获得gdb的帮助信息。如果想要了解某个具体命令的帮助信息。如果想要了解某个具体命令(比如(比如break)的帮助信息,在)的帮助信息,在gdb提示符下输入下面的提示符下输入下面的命令:命令:break屏幕上会显示关于屏幕上

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com