




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux开发基础原仓周第二章Linux程序设计基础—C环境Linux编程概述文本编辑器viLinux下函数库GCC及其使用调试工具gdbGNUmake和makefileLinux编程概述
Linux软件开发一直在Internet环境下讲行。这个环境是全球性的,编程人员来自世界各地。只要能够访问Web站点,就可以启动一个以Linux为基础的软件项目。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到Internet站点上,任何用户都可以访问和下载它。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。大多数Linux软件是经过自由软件基金会(FreeSoftwareFoundation)提供的GNU(GNU即GNU’snotUNIX)公开认证授权的,因而通常被称作GNU软件。GNU软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。
Linux程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。例如编程时,先用普通的编程语言生成一系列指令,这些指令可被翻译为适当的可执行应用程序的二进制代码。这个翻译过程可由解释器一步步来完成,或者也可以立即由编译器明确地完成。shell编程语言如BASH、TCSH、GAWK、Perl、Tcl和Tk都利用自己的解释器。用这些语言编制的程序尽管是应用程序文件,但可以直接运行。编译器则不同,它将生成一个独立的二进制代码文件然后才可以运行。Linux编程风格GNU风格Linux内核编程风格GNU风格(1/2)函数返回类型说明和函数名分两行放置,函数起始字符和函数开头左花括号放到最左边。尽量不要让两个不同优先级的操作符出现在相同的对齐方式中,应该附加额外的括号使得代码缩进可以表示出嵌套。按照如下方式排版do-while语句:do{}while()每个程序都应该以一段简短的说明其功能的注释开头。请为每个函数书写注释,说明函数是做什么的,需要哪些入口参数,参数可能值的含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不能工作的任何可能的值,应该进行特殊说明。如果存在重要的返回值,也需要说明。不要声明多个变量时跨行,每一行都以一个新的声明开头。GNU风格(2/2)当一个if中嵌套了另一个if-else时,应用花括号把if-else括起来。要在同一个声明中同时说明结构标识和变量或者结构标识和类型定义(typedef)。先定义变量,再使用。尽量避免在if的条件中进行赋值。请在名字中使用下划线以分割单词,尽量使用小写;把大写字母留给宏和枚举常量,以及根据统一惯例使用的前缀。例如,应该使用类似ignore_space_change_flag的名字;不要使用类似iCantReadThis的名字。用于表明一个命令行选项是否给出的变量应该在选项含义的说明之后,而不是选项字符之后被命名。Linux内核编程风格Linux内核缩进风格是8个字符。Linux内核风格采用K&R标准,将开始的大括号放在一行的最后,而将结束的大括号放在一行的第一位。命名尽量简洁。不应该使用诸如ThisVariableIsATemporaryCounter之类的名字。应该命名为tmp,这样容易书写,也不难理解。命名全局变量,应该用描述性命名方式,例如应该命名“count_active_users()”,而不是“cntusr()”。本地变量应该避免过长。函数最好短小精悍,一般来说不要让函数的参数多于10个,否则应该尝试分解这个过于复杂的函数。通常情况,注释说明代码的功能,而不是其实现原理。避免把注释插到函数体内,而写到函数前面,说明其功能,如果这个函数的确很复杂,其中需要有部分注释,可以写些简短的注释来说明那些重要的部分,但是不能过多。文本编辑器vivi的模式vi的进入命令模式插入模式末行模式vi的模式CommandMode(命令模式)这是执行vi后的缺省模式此时键盘输入当作命令命令有大小写之区分InputMode(插入模式)使用a、i、o、c、r、s
进入插入模式用户输入的任何字符都被vi当做文件内容保存起来,并将其显示在屏幕上按下ESC键即可回到CommandModevi的模式LastMode(末行模式)在CommandLine按下:即即可可进入该该模式式用来进行行保存存文件件、打开文文档或环境的设定命令有有大小小写之分vi的的进入入和内内容输输入进入::vi文文件名名输入文文件内内容((进进入插插入模模式))新增(append)a从从光光标所所在位位置后后面开开始新新增内内容A从从光标标所在在行最最后面面的地地方开开始新新增内内容。。插入(insert)i从从光光标所所在位位置前前面开开始插插入内内容I从从光标标所在在行的的第一一个非非空白白字符符前面面开始始插入入资料料。开始(open)o在在光光标所所在行行下新新增一一行并并进入入输入入模式式。O在在光标标所在在行上上新增增一行行并进进入输输入模模式。。(命令令模式式)命令模模式1、光光标的的移动动h左左移一一个字字符l右右移一一个字字符j下下移一一行k上上移一一行w,W跳跳至后后一个个字的的开头头(W忽略略标点点)b,B跳跳至至前一一个字字的开开头((B忽忽略标标点))e移移动到到后一一个字字的末末尾^至至本行行第一一个非非空字字符$至至行尾尾0至至行首首H移移动到到当前前窗口口的第第一列列M移移动动到当当前窗窗口的的中间间列L移移动到到视窗窗的最最后一一列)光光标标所在在位置置到下下个句句子的的第一一个字字母(光光标所所在位位置到到该句句子的的第一一个字字母}光光标标所在在位置置到该该段落落的最最后一一个字字母{光光标标所在在位置置到该该段落落的第第一个个字母母命令模模式1、光光标的的移动动(续续)nH将将光标标移到到屏幕幕的第第n行行nL将将光标标移到到屏幕幕的倒倒数第第n行行CTRL-d向向下下半页页CTRL-f向向下下一页页CTRL-u向向上上半页页CTRL-b向向上上一页页n-减减号移移动到到上一一行的的第一一个非非空白白字符符,前前面加加上数数字可可以指指定移移动到到以上上n行行n+加加号号移动动到下下一行行的第第一个个非空空白字字符,,前面面加上上数字字可以以指定定移动动到以以下n行行命令模模式2、删删除x删删除除光标标所在在字符符X删删除光光标前前面的的字符符s删删除光光标所所在字字符,,并进进入输输入模模式S删删除除光标标所在在的行行,并并进入入输入入模式式dd删删除除光标标所在在的行行D从从光光标位位置开开始删删除到到行尾尾d与光光标移移动命命令的的组合合命令模模式3、修修改r修修改改光标标所在在字符符,r后后接着着要修修改的的字符符。如如,rc可可以以用字字符““c””替换换光标标所指指向的的当前前字符符R进进入入替换换状态态,新新增内内容会会覆盖盖原先先内容容,直直到按按[ESC]回回到命命令模模式下下为止止cc修修改光光标所所在行行C修修改从从光标标位置置到该该行末末尾的的内容容c与与光标标移动动命令令的组组合命令模模式4、复复制和和移动动yy复复制当当前行行到内内存缓缓冲区区nyy复复制制n行行内容容到内内存缓缓冲区区y与光光标移移动的的组合合p将将缓冲冲区的的内容容粘贴贴到光光标的的后面面P将将缓冲冲区的的内容容粘贴贴到光光标的的前面面另:在在末行行模式式下实实现移移动:n1,n2mn3:把n1到n2行内容搬到第第n3行后5、搜搜索字字符串串/pattern移移至下下一个个包含含pattern的的行?pattern移移至至上一一个包包含pattern的行行/往往下重重复查查找?往往上上重复复查找找n在在同同一方方向重重复查查找N在在相反反方向向重复复查找找/pattern/+n移移至下下一个个pattern所所在行行后的的第n行?pattern?-n移移至上上一个个Pattern所所在行行前的的第n行6、其其他u撤撤销前前一条条命令令的结结果*.$^[]{}\/包含在在查找找字符符串中中,要要用转转义字字符(\)命令模模式末行模模式1、文文件的的保存存和退退出:w保存:q退出:w!强制保保存:q!强制退退出:wq保存退退出:wq!强制保保存退退出末行模模式2、字字符串串的替替换:s/str1/str2/用用字字符串串str2替替换换行中中首次次出现现的字字符串串str1:s/str1/str2/g用用字符符串str2替替换行行中所所有出出现的的字符符串str1:.,$s/str1/str2/g用用字符符串str2替替换正正文当当前行行到末末尾所所有出出现的的字符符串str1:1,$s/str1/str2/g用用字符符串str2替替换正正文中中所有有出现现的字字符串串str1:g/str1/s//str2/g功功能同同上末行模模式其他:::n将将光标标移到到第n行行编辑多多个文文件vifile1file2……:n编编辑下下一个个文件件:efilename编编辑指指定文文件Linux下函函数库库(1/3)一个““程序序函数数库””就是是一个个文件件包含含了一一些编编译好好的代代码和和数据据,这这些编编译好好的代代码和和数据据可以以在事事后供供其他他的程程序使使用。。程序序函数数库可可以使使整个个程序序更加加模块块化,,更容容易重重新编编译,,而且且更方方便升升级。。可分分为两两种类类型::静态函函数库库(staticlibraries):是是一个个普通通的目目标文文件的的集合合,一一般用用“.a””作为为文件件的后后缀。。静态态函数数库和和共享享函数数库相相比有有很多多的缺缺点,,占用用内存存空间间多。。但使使用ELF格式式的静静态库库函数数生成成的代代码可可以比比使用用共享享函数数库的的程序序运行行速度度上快快一些些。可以用用ar这个个程序序来创创建一一个静静态函函数库库文件件,或或者往往一个个已经经存在在地静静态函函数库库文件件添加加新的的目标标代码码。例如,把把file1.o和和file2.o加加入到到my_library.a这个个函数数库文文件::arrcsmy_library.afile1.ofile2.o然后运运行ranlib,以以给库库加入入一些些索引引信息息Linux下函函数库库(2/3)共享函函数库库(sharedlibraries):当当一个个可执执行程程序在在启动动的时时候被被加载载的函函数。。每个个共享享函数数库都都有个个特殊殊的名名字,,称作作“soname””。soname名名字命命名必必须以以“lib”作作为前前缀,,然后后是函函数库库的名名字,,然后后是““.so””,最最后是是版本本号信信息。。优点::多进进程使使用同同一函函数库库;修修改函函数库库不需需重新新连编编。安装一一个新新版本本的函函数库库的时时候,,要先先将这这些函函数库库文件件拷贝贝到一一些特特定的的目录录中,,运行行ldconfig就可可以。。ldconfig检查查已经经存在在的库库文件件,然然后创创建soname的的符号号链接接到真真正的的函数数库,,同时时设置置/etc/ld.so.cache这个个缓冲冲文件件。例例如如,创创建两两个目目标文文件(a.o和和b.o),然然后创创建一一个包包含a.o和b.o的共共享函函数库库。gcc-fPIC-g-c-Walla.cgcc-fPIC-g-c-Wallb.cgcc-shared-Wl,-soname,liblusterstuff.so.1-oliblusterstuff.so.1.0.1a.ob.o––lc注::””-fPIC””是是位位置置无无关关参参数数,,””-g””和和““--Wall””参参数数不不是是必必须须的的。。Linux下下函函数数库库((3/3))函数数库库和和头头文文件件的的保保存存位位置置a.函函数数库库/lib::系系统统必必备备共共享享函函数数库库/usr/lib::标标准准共共享享函函数数库库和和静静态态函函数数库库/usr/i486-linux-libc5/lib::libc5兼兼容容性性函函数数库库/usr/X11R6/lib::X11R6的的函函数数库库/usr/local/lib::本本地地函函数数库库b.头头文文件件/usr/include::系系统统头头文文件件/usr/local/include::本本地地头头文文件件c.共共享享函函数数库库的的相相关关配配置置和和命命令令/etc/ld.so.conf::包包含含共共享享库库的的搜搜索索位位置置ldconfig::共共享享库库管管理理工工具具,,一一般般在在更更新新了了共共享享库库之之后后要要运运行行该该命命令令ldd::可可查查看看可可执执行行文文件件所所使使用用的的共共享享函函数数库库使用用GNUcc开开发发应应用用程程序序gcc的的简简介介可执执行行文文件件的的格格式式gcc的的使使用用gcc的的简简介介gcc是是GNU的的C和和C++编编译译器器。。实实际际上上,,gcc能能够够编编译译多种种语言言::C、、C++和和ObjectC等等。。利利用用gcc命命令令可可同同时时编编译译并并连连接接C和和C++源源程程序序。。也也可可以以对对几几个个C源源文文件件利利用用gcc编编译译、、连连接接并并生生成成可可执执行行文文件件。。gcc可可以以使使程程序序员员灵灵活活地地控控制制编编译译过过程程。。编编译译过过程程一一般般可可以以分分为为下下面面四四个个阶阶段段,,每每个个阶阶段段分分别别调调用用不不同同的的工工具具进进行行处处理理预处理链接编译组译源程序(*.c)可执行文件预处理器编译器组译器连接器gcc的的四四个个阶阶段段命令令gcc首首先先调调用用cpp进进行行预预处处理理,,在在预预处处理理过过程程中中,,对对源源代代码码文文件件中中的的文文件件包包含含(include)、、预预编编译译语语句句(如如宏宏定定义义define等等)进进行行分分析析。。接着着调调用用cc1进进行行编编译译,,这这个个阶阶段段根根据据输输入入文文件件生生成成以以.o为为后后缀缀的的目目标标文文件件。。汇编编过过程程是是针针对对汇汇编编语语言言的的步步骤骤,,调调用用as进进行行工工作作,,一一般般来来讲讲,,.S或或.s为为后后缀缀的的汇汇编编语语言言源源代代码码文文件件汇汇编编之之后后都都生生成成以以.o为为后后缀缀的的目目标标文文件件。。当所所有有的的目目标标文文件件都都生生成成之之后后,,gcc就就调调用用ld来来完完成成最最后后的的关关键键性性工工作作,,这这个个阶阶段段就就是是连连接接。。在在连连接接阶阶段段,,所所有有的的目目标标文文件件被被安安排排在在可可执执行行程程序序中中的的恰恰当当的的位位置置,,同同时时,,该该程程序序所所调调用用到到的的库库函函数数也也从从各各自自所所在在的的函函数数库库中中连连到到合合适适的的地地方方。。可执行文文件格式式Linux系统统中可执执行文件件有两种种格式。。第一种格格式是a.out格式式,这种种格式用用于早期期的Linux系统以以及Unix系统的的原始格格式。a.out来自自于UnixC编译译程序默默认的可可执行文文件名。。当使用用共享库库时,a.out格式式就会发发生问题题。把a.out格式式调整为为共享库库是一种种非常复复杂的操操作。因此,一一种新的的文件格格式被引引入Unix系系统5的的第四版版本和Solaris系统中中。它被被称为可可执行和和连接的的格式((ELF)。这这种格式式很容易易实现共共享库。。ELF格格式已经经被Linux系统作作为标准准的格式式采用。。gcc编编译程序序产生的的所有的的二进制制文件都都是ELF格式式的文件件(即使使可执行行文件的的默认名名仍然是是a.out))。较旧旧的a.out格式的的程序仍仍然可以以运行在在支持ELF格格式的系系统上。。GNUC的的使用基本语法法gcc[options][filenames]说明:在gcc后面可可以有多多个编译译选项,,同时进进行多个个编译操操作。很很多的gcc选选项包括括一个以以上的字字符。因因此你必必须为每每个选项项指定各各自的连连字符。。例如,,下面的的两个命命令是不不同的::gcc-p-gtest1.cgcc-pgtest1.c当你不用用任何选选项编译译一个程程序时,,GCC将会建建立(假假定编译译成功)一个名名为a.out的可执执行文件件。gcc选选项-o选项项你能用-o编编译选选项来为为将产生生的可执执行文件件指定一一个文件件名来代代替a.out。例:gcc––ocountcount.c-c选项项:告诉诉GCC仅把源源代码编编译为目目标代码码而跳过过汇编和和连接的的步骤。。这个选选项使用用的非常常频繁,,因为它它使得编编译多个个C程序序时速度度更快并并且更易易于管理理。缺省省时GCC建立立的目标标代码文文件有一一个.o的扩展展名。例:gcc––ctest2.c-E只只运行C预预编译器器。-S编编译选项项告诉gcc在为为C代代码产产生了汇汇编语言言文件后后停止编编译。-shared生成成共享目目标文件件。通常常用在建建立共享享库时。。-static禁止止使用共共享连接接。警告选项项在gcc中用开开关-Wall控制警警告信息息,使用用示例命命令如下下:gcc––Wall-otest3_1test3_1.c-w不不生成任任何警告告信息。。查找选项项gcc一一般使用用默认路路径查找找头文件件和库文文件。如如果文件件所用的的头文件件或库文文件不在在缺省目目录下,,则编译译时要指指定它们们的查找找路径。。-I选项项:指定定头文件件的搜索索目录例:gcc––I/export/home/st––otest1test1.c-L选项项:指定定库文件件的搜索索目录例:gcc––L/usr/X11/R6/lib––otest1test1.c多个源文文件生成成一个可可执行文文件问题:有有多个源源文件时时,如何何生成一一个可执执行文件件?方法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/specsgccversion2.7.2-V选选项如果安装装了多个个版本的的gcc,并且且想强制制执行其其中的某某个版本本,可以以用命令令通知系系统用户户要使用用的版本本。gcc-V2.6.3-v宏定义选选项-DMACRO以以字符串串“1””定义MACRO宏宏。-DMACRO=DEFN以字字符串““DEFN”定定义MACRO宏宏。-UMACRO取取消对MACRO宏宏的定定义。调试和剖剖析选项项使用调试试选项后后,gcc在进进行编译译的时候候,在目目标文件件(.o)和创创建的可可执行文文件中插插入额外外信息,,这些额额外信息息使gdb能够够判断编编译过的的代码和和源代码码之间的的关系。。-g选项项:告诉诉GCC产生能能被GNU调调试器器使用的的调试信信息以便便调试你你的程序序。例:gcc––g––otest3test3.c-pg选选项:告告诉GCC在你你的程序序里加入入额外的的代码,,执行时时,产生生gprof用用的剖析析信息以以显示你你的程序序的耗时时情况。。使用gdb调试试工具,,命令行行如下::例:gcc––ggdb3––otest3test3.c调试工具具gdbGDB调调试器简简介gdb的的常用用命令gdb应应用实例例gdb简简介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++程序序的常用用调试工工具之一一。gdb的启启动在命令行上上输入gdb并按回回车键就可可以运行gdb了,,如果一切切正常的话话,将启动动gdbgdb[filename]出现(gdb)在这里,可可以输入调调试命令在可以使用用gdb调试程程序之前,,必须使用用-g选选项编译译源文件。。可在makefile中中如下定定义CFLAGS变量::CFLAGS=-g运行获取帮助信信息启动gdb后,可以以在命令行行上指定很很多的选项项。输入::help可以获得gdb的帮帮助信息。。如果想要了了解某个具具体命令((比如break))的帮助信信息,在gdb提示示符下输入入下面的命命令:break屏幕上会显显示关于break的帮助信信息。从返返回的信息息可知,break是用于设设置断点的的命令。另一个获得得gdb帮帮助的方法法是浏览gdb的手手册页。在在LinuxShell提提示符输入入:mangdb可以看到man的手手册页gdb命令令的分类在gdb提示示符处键入入help,将列出出命令的分分类,主要要的分类有有:aliases:命命令别名breakpoints:断断点定义;;data::数据查看看;files:指定并并查看文件件;internals:维护命命令;running:程程序执行;;stack:调用栈栈查看;statu:状态查查看;tracepoints:跟跟踪程序执执行。后跟命令的的分类名,,可获得该该类命令的的详细清单单基本gdb命令(1/2)file命命令:装入入想要调试试的可执行行文件。cd命令::改变工作作目录。pwd命令令:返回当当前工作目目录。run命令令:执行当当前被调试试的程序。。kill命命令:停止止正在调试试的应用程程序。list命命令:列出出正在调试试的应用程程序的源代代码。break命令:设设置断点。。watch命令:设设置监视点点,监视表表达式的变变化。awatch命令::设置读写写监视点。。当要监视视的表达式式被读或写写时将应用用程序挂起起。它的语语法与watch命命令相同。。rwatch命令::设置读监监视点,当当监视表达达式被读时时将程序挂挂起,等侍侍调试。此此命令的语语法与watch相相同。next命命令:执行行下一条源源代码,但但是不进入入函数内部部。也就是是说,将一一条函数调调用作为一一条语句执执行。执行行这个命令令的前提是是已经run,开始始了代码的的执行。基本gdb命令(2/2)step命命令:执行行下一条源源代码,进进入函数内内部。如果果调用了某某个函数,,会跳到函函数所在的的代码中等等候一步步步执行。执执行这个命命令的前提提是已经用用run开开始执行代代码。display命令令:在应用用程序每次次停止运行行时显示表表达式的值值。infobreak命令::显示当前前断点列表表,包括每每个断点到到达的次数数16)infofiles命令:显显示调试文文件的信息息。17)infofunc命命令:显示示所有的函函数名。18)infolocal命令:显显示当前函函数的所有有局部变量量的信息。。19)infoprog命命令:显示示调试程序序的执行状状态。20)print命命令;显示示表达式的的值。21)delete命令:删删除断点。。指定一个个断点号码码,则删除除指定断点点。不指定定参数则删删除所有的的断点。22)Shell命命令:执行行LinuxShell命命令。23)make命令令:不退出出gdb而而重新编译译生成可执执行文件。。24)Quit命令令:退出gdb。gdb使使用实例((1/2))/*一个个有错误的的C源源程序*/#include<stdio.h>#include<stdlib.h>staticcharbuff[256];staticchar*string;intmain(){printf("Pleaseinputastring:");gets(string);printf("\nYourstringis:%s\n",string);}上面这个程程序非常简简单,其目目的是接受受用户的输输入,然后后将用户的的输入打印印出来。该该程序使用用了一个个未经过初初始化的字字符串地址址string,,因此,编编译并运行行之后,将将出现SegmentFault错误::$gcc-otest-gtest.c$./testPleaseinputastring:asfdSegmentationfault(coredumped)gdb使使用实例((2/2))为了查找该该程序中出出现的问题题,我们利利用gdb,并按按如下的步步骤进行::1.运行gdbbugging命命令,装装入bugging可执执行文件;;2.执行装装入的bugging命命令;3.使用where命令令查看程序序出错的地地方;4.利用list命令查查看调用gets函数附附近的代码码;5.唯一能能够导致gets函数出出错的因素素就是变量量string。。用print命命令查看看string的的值;6.在gdb中中,我们可可以直接修修改变量的的值,只要要将string取一个个合法的指指针值就可可以了,为为此,我我们在第11行行处设置断断点;7.程序重重新运行到到第11行处停停止,这时时,我们可可以用setvariable命命令修改改string的的取值;;8.然后继继续运行,,将看到正正确的程序序运行结果果。GNUmake和和makefileGNUmake概概述Makefile的的基本结结构Makefile中中的变量GNUmake的的主要预预定义变量量Makefile的的隐含规则则make命命令行选项项使用automake和autoconf产生生MakefileGNUmake概概述在大型的开开发项目中中,人们通通常利用make工具来来自动完成成编译工作作。这些工工作包括::如果仅修改改了某几个个源文件,,则只重新新编译这几几个源文件件;如果某个头头文件被修修改了,则则重新编译译所有包含含该头文件件的源文件件。利用这种自自动编译可可大大简化化开发工作作,避免不不必要的重重新编译。。实际上,make工工具通过过一个称为为makefile的文文件来完成成并自动维维护编译工工作。makefile需需要按照某某种语法进进行编写,,其中说明明了如何编编译各个源源文件并连连接生成可可执行文件件,并定义义了源文件件之间的依依赖关系。。当修改改了其中某某个源文件件时,如果果其他源文文件依赖于于该文件,,则也要重重新编译所所有依赖该该文件的源源文件。默认情况下下,GNUmake工具具在当前工工作目录按按如下顺序序搜索makefile::GNUmakefilemakefileMakefilemakefile举举例在UNIX中,习惯惯使用makefile作作为makfile文件件。Linux程序员使使用第三种种文件名Makefile。。因为第一一个字母是是大写,通通常被列在在一个目录录的文件列列表的最前前面。如果要使用用其他文件件作为makefile,,则可利用用类似下下面的make命命令选项项指定makefile文文件:$make-fMakefile.debug例1:一个个简单的makefileprog:prog1.oprog2.ogccprog1.oprog2.o-oprog
prog1.o:prog1.clib.hgcc-c-I.-oprog1.oprog1.cprog2.o:prog2.cgcc-cprog2.cMakefile的的基本结结构(1/2)Makefile是是一个文本本形式的数数据库文件件,其中包包含一些规规则来告诉诉make处理哪些些文件以及及如何处理理这些文件件。规则主要是是描述哪些些文件(称称为target目目标文件,,不要和编编译时产生生的目标文文件相混淆淆)是从哪哪些别的文文件(称为为dependency依赖赖文件)中中产生的,,以及用什什么命令((command))来执行这这个过程。。依靠这些信信息,make会对对磁盘上的的文件进行行检查,如如果目标文文件的生成成或被改动动时的时间间(称为该该文件时间间戳)至少少比它的一一个依赖文文件还旧的的话,make就执执行相应的的命令,以以更新目标标文件。目标文件不不一定是最最后的可执执行文件,,可以是任任何一个中中间文件并并可以作为为其他目标标文件的依依赖文件。。Makefile的的基本结结构(2/2)Makefile规规则的一般般形式如下下:target:dependencydependency(tab)<command>一个Makefile文文件主要含有有一系列的规规则,每条规规则包含以下下内容。一个目标(target),即make最终需需要创建的文文件,如可执执行文件和目目标文件;目目标也可以是是要执行的动动作,如“clean””。一个或多个依依赖文件(dependency))列表,通常常是编译目标标文件所需要要的其他文件件。一系列命今(command),是是make执执行的动作,,通常是把指指定的相关文文件编译成目目标文件的编编译命令,每每个命令占一一行,且每个个命令行的起起始字符必须须为TAB字字符。除非特别指定定,否则make的工作作目录就是当当前目录。target是需要创建建的二进制文文件或目标文文件,dependency是在创创建target时需要要用到的一个个或多个文件件的列表,命命令序列是创创建target文件所所需要执行的的步骤,比如如编译命令。。Makefile实例((1/3)#以#开头头的为注释行行test:prog.ocode.ogcc–otestprog.ocode.oprog.o:prog.cprog.hcode.hgcc–cprog.c–oprog.ocode.o:code.ccode.hgcc–ccode.c–ocode.oclean::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按顺序读取取makefile中的的规则,然后检查该规规则中的依赖赖文件与目标标文件的时间间戳哪个更新新如果目标文件件的时问戳比比依赖文件还还早,就按规规则中定义的的命令更新目目标文件。如果该规则中中的依赖文件件又是其他规规则中的目标标文件,那么么依照规则链链不断执行这这个过程,直直到Makefile文文件的结束,,至少可以找找到一个不是是规则生成的的最终依赖文文件,获得此此文件的时间间戳然后从下到上上依照规则链链执行目标文文件的时间戳戳比此文件时时间戳旧的规规则,直到最最顶层的规则则通过以上的分分析过程,可可以看到make的优点点,因为.o目标文件依依赖.c源文文件,源码文文件里一个简简单改变都会会造成那个文文件被重新编编译,并根据据规则链依次次由下到上执执行编译过程程,直到最终终的可执行文文件被重新连连接。例如,当改变变一个头文件件的时候,由由于所有的依依赖关系都在在Makefile里,,因此不再需需要记住依赖赖此头文件的的所有源码文文件,make可以自动动的重新编译译所有那些因因依赖这个头头文件而改变变了的源码文文件,如果需需要,再进行行重新连接Makefile中的变变量Makefile里的变变量就像一个个环境变量。。事实上,环环境变量在make中也也被解释成make的变变量。这些变变量对大小写写敏感,一般般使用大写宇宇母。几乎可可以从任何地地方引用定义义的变量,变变量的主要作作用如下:保存文件名列列表。在前面面的例子里,,作为依赖文文件的一些目目标文件名出出现在可执行行文件的规则则中,而在这这个规则的命命令行里同样样包含这些文文件并传递给给gcc做为为命令参数。。如果使用一一个变量来保保存所有的目目标文件名,,则可以方便便地加入新的的目标文件而而且不易出错错。保存可执行命命令名,如编编译器。在不不同的Linux系统中中存在着很多多相似的编译译器系统,这这些系统在某某些地方会有有细微的差别别,如果项目目被用在一个个非gcc的的系统里,则则必须将所有有出现编译器器名的地方改改成用新的编编译器名。但但是如果使用用一个变量来来代替编译器器名,那么只只需要改变该该变量的值。。其他所有地地方的命令名名就都改变了了。保存编译器的的参数。在很很多源代码编编译时,gcc需要很长长的参数选项项,在很多情情况下,所有有的编译命令令使用一组相相同的选项,,如果把这组组选项使用一一个变量代表表,那么可以以把这个变量量放在所有引引用编译器的的地方。当要要改变选项的的时候,只需需改变一次这这个变量的内内容即可。变量的定义和和使用Makefile中的变变量是用一个个文本串在Makefile中定义义的,这个文文本串就是变变量的值。只只要在一行的的开始写下这这个变量的名名字,后面跟跟一个“=””号,以及要要设定这个变变量的值即可可定义变量,,下面是定义义变量的语法法:VARNAME=string使用时,把变变量用括号括括起来,并在在前面加上$符号,就可可以引用变量量的值:${VARNAME}make解释释规则时,VARNAME在等式右右端展开为定定义它的字符符串。变量一般都在在Makefile的头头部定义。按按照惯例,所所有的Makefile变量都应该该是大写。如如果变量的值值发生变化,,就只需要在在一个地方修修改,从而简简化了Makefile的维护。Makefile变量举举例现在利用变量量把前面的Makefile重写一一遍:OBJS=prog.ocode.oCC=gcctest:${OBJS}${CC}–otest${OBJS}prog.o:prog.cprog.hcode.h${CC}–cprog.c–oprog.ocode.o:code.ccode.h${CC}–ccode.c–ocode.oclean::rm–f*.o变量的类型除用户自定义义的变量外,,make还还允许使用环境变量使用环境变量量的方法很简简单,在make启动时时,make读取系统当当前已定义的的环境变量,,并且创建与与之同名同值值的变量,因因此用户可以以像在shell中一样样在Makefile中中方便的引用用环境变量。。需要注意的是是,如果用户户在Makefile中中定义了同名名的变量,用用户自定义变变量将覆盖同同名的环境变变量自动变量预定义变量GNUmake的主主要预定义变变量(1/2)$*不不包含含扩展名的目目标文件名称称。$+所所有有的依赖文件件,以空格分分开,并以出出现的先后为为序,可能包包含重复的依依赖文件。$<第第一一个依赖文件件的名称。$?所所有有的依赖文件件,以空格分分开,这些依依赖文件的修修改日期比目目标的创建日日期晚。$@目目标的完完整名称。$^所所有有的依赖文件件,以空格分分开,不包含含重复的依赖赖文件。$%如如果目目标是归档成成员,则该变变量表示目标标的归档成员员名称。例如如,如果目标标名称为mytarget.so(image.o),则$@为mytarget.so,,而$%为为image.o。。AR归归档维维护程序的名名称,默认值值为ar。。ARFLAGS归归档维护护程序的选项项。AS汇汇编程序序的名称,默默认值为as。ASFLAGS汇汇编程序序的选项。GNUmake的主主要预定义变变量(2/2)CCC编译译器的名称,,默认值为cc。CFLAGSC编译器器的选项。CPPC预预编译器的名名称,默认值值为$(CC)-E。CPPFLAGSC预预编译的选选项。CXXC++编译器的的名称,默认认值为g++。CXXFLAGSC++编译器器的选项。FCFORTRAN编编译器的名名称,默认值值为f77。FFLAGSFORTRAN编编译器的选项项。Makefile的隐含含规则在上面的例子子中,几个产产生目标文件件的命令都是是从“.c””的C语言源源文件和相关关文件通过编编译产生“.o”目标文文件,这也是是一般的步骤骤。实际上,,make可可以使工作更更加自动化,,也就是说,,make知知道一些默认认的动作,它它有一些称作作隐含规则的的内置的规则则,这些规则则告诉make当用户没没有完整地给给出某些命令令的时候,应应该怎样执行行。例如,把生成成prog.o和code.o的命命令从规则中中删除,make将会查查找隐含规则则,然后会找找到并执行一一个适当的命命令。由于这这些命令会使使用一些变量量,因此可以以通过改变这这些变量来定定制make。象在前面面的例子中所所定义的那样样,make使用变量CC来定义编编译器,并且且传递变量CFLAGS(编译器参参数)、CPPFLAGS(C语言言预处理器参参数)、TARGET_ARCH((目标机器的的结构定义))给编译器,,然后加上参参数-c,后后面跟变量$<(第一个个依赖文件名名),然后是是参数-o加加变量$@((目标文件名名)。综上所述,一一个C编译的的具体命令将将会是:${CC}${CFLAGS}${CPPFLAGS}${TARGET_ARCH}–c$<-o$@隐含规则举例例在上面的例子子中,利用隐隐含规则,可可以简化为::OBJS=prog.ocode.oCC=gcctest:${OBJS}${CC}–o$@$^prog.o:prog.cprog.hcode.hcode.o:code.ccode.hclean:rm––f*.omake命命令行行选项项直接在在make命命令令的后后面键键入目目标名名可建建立指指定的的目标标,如如果直直接运运行make,则则建立立第一一个目目标。。还可可以用用make-fmymakefile这这样样的命命令指指定make使使用特特定的的makefile,,而不不是默默认认的GNUmakefile、、makefile或或Makefile。。GNUmake命命令令还有有一些些其他他选项项,下下面是是GNUmake命命令令的常常用命命令行行选项项命令令行选选项含含义::-CDIR在在读取取makefile之之前前改变变到指指定的的目录录DIR。-fFILE以以指定定的FILE文文件作作为makefile。-h显显示所所有的的make选选项项。-i忽忽略略所有有的命命令执执行错错误。。-IDIR当当包含含其他他makefile文文件件时,,可利利用该该选项项指定定搜索索目录录。-n只只打印印要执执行的的命令令,但但不执执行这这些命命令。。-p显显示make变变量数数据库库和隐隐含规规则。。-s在在执行行命令令时不不显示示命令令。-w在在处处理makefile之之前和和之后后,显显示工工作目目录。。-WFILE假假定定文件件FILE已已经经被修修改。。使用automake和和autoconf产生生Makefile在开始始使用用Automake和autoconf之之前,,请先先确认认系统统已经经安装装以下下的软软件::GNUAutomakeGNUAutoconfGNUm4PerlGNULibtool(如果果你需需要产产生sharedlibrary)Automake所所产产生的的Makefile除除了了可以以做到到程序序的编编译和和连接接,也也已经经把如如何产产生程程序文文件的的操作作,以以及把把安装装程序序都考考虑进进去了了,所所以源源程序序所存存放的的目录录架构构最好好符合合GNU的的标准准惯例例,下下面用用hello.c来来作作为例例子进进行说说明。。生成一一个源源程序序在工作作目录录下建建立一一个新新的子子目录录devel,,再在在devel下下建立立一个个hello的的子目目录,,这个个目录录将作作为存存放hello这这个个程序序及其其相关关文件件的地地方::用编辑辑器写写个hello.c文件件:#include<stdio.h>intmain(intargc,char**argv){printf("Hello,GNU!\n");return0;}使用Autoconf及及Automake来来产产生Makefile文文件的的步骤骤autoscan产产生生一个个configure.in的模模板,,执行行autoscan后后会会产生生一个个configure.scan的的文件件,可可以用用它做做为configure.in文文件的的模板板:编辑configure.scan文文件,,如下下所示示,并并且把把文件件名改改成configure.in执行aclocal和autoconf,,分分别会会产生生aclocal.m4及及configure两两个个文件件:编辑Makefile.am文件件,内内容如如下::执行automake--add-missing,,Automake会会根根据Makefile.am产产生一一些文文件,,包含含最重重要的的Makefile.in::最后执执行./configure使用RCS/CVS来管管理源源代码码RCS的使使用CVS的使使用RCS的使使用RCS(RevisionControlSystem)即即程序序改版版控制制系统统,主主要功功能是是用来来管理理文件件的版版本,,可以以节省省空间间和时时间。。这样样就不不需要要在每每个程程序开开发到到某一一个阶阶段就就将数数据拷拷贝到到其他他的地地方备备份起起来了了。RCS提供供了如如下几几个最最重要要的指指令的的:ci指指令::将文文件放放入RCS目录录下的的控制制系统统co指指令令::从从RCS目目录录下下将将文文件件取取出出rcs指指令令::用用来来对对RCS文文件件进进行行参参数数的的设设置置基本本操操作作方方式式一般般而而言言,,RCS所所产产生生出出来来的的文文件件会会放放在在RCS目目录录中中。。所所以以第第一一步步必必须须要要在在当当前前的的目目录录下下制制作作一一个个文文件件::[root@wyhlinux]#mkdirRCS接下下来来只只要要使使用用ci指指令令。。就就可可以以把把文文件件备备份份到到RCS改改版版控控制制系系统统中中::[root@wyhlinux]#citest.c若要要将将文文件件取取出出,,可可以以使使用用下下列列指指令令::[root@wyhlinux]#cotest.c取出出来来的的文文件件是是只只读读文文件件,,若若要要取取出出可可以以写
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《沟通技能训练》课件-第一章 沟通概论
- 2025年银行零售业务数字化营销转型中的金融科技与金融消费者权益保护报告
- 工业互联网平台射频识别(RFID)在智能工厂设备性能监测与创新维护中的应用报告
- 工业互联网平台数据备份与恢复方案在智能制造中的应用报告
- Unit+2+Exploring+English+Understanding+Ideas+Language+points2025-2026学年高中英语外研版(2019)必修第一册
- 工业互联网网络运维 课件 任务1.3 理解工业互联网网络运维职业规范
- 2025秋教科版科学二年级上册教学课件:第二单元科学阅读 地球家园
- 2023-2024学年贵州省六盘水市盘州市九年级上学期道德与法治期末试题及答案
- 趣味成语 题目及答案
- 数据结构c语言 期末考试试题及答案
- 风电场道路维护与管理方案
- 四川省成都市2024-2025学年下册新七年级分班(奖学金)数学模拟试题(附答案)
- 智鼎在线测评题高潜人才
- 高中历史说课课件
- 干部履历表填写范本(中共中央组织部1999年)
- 专题13 非连续性文本阅读(解析版)
- ICU护理进修汇报
- 2024年初中生物教师进城选调考试模拟试题及答案套
- 武汉××岩土工程勘察详细报告
- 豆制品购销合同范本
- SH/T 3533-2024 石油化工给水排水管道工程施工及验收规范(正式版)
评论
0/150
提交评论