第3章 Linux编程基础.ppt_第1页
第3章 Linux编程基础.ppt_第2页
第3章 Linux编程基础.ppt_第3页
第3章 Linux编程基础.ppt_第4页
第3章 Linux编程基础.ppt_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第三章 Linux下的C编程基础,本章主要介绍Linux环境下C语言编程的基本技能。主要内容包括: 1.编辑器(Vi和Emacs)的基本操作 2.Gcc编译器的使用 3.Gdb调试器的使用 4.Makefile介绍 5.使用GNU Autotools来生成Makefile文件、congfigure文件。,2,3.1.1 Vi编辑器,3.1.1 Vi Vi是Linux系统上的第一个全屏幕交互式编辑程序。我们目前一般使用的是Vim(Vi Improved)。,3,3.1.1 Vi编辑器,一、Vi工作模式 Vi有3种工作模式,分别为命令行模式、插入模式及底行模式 (1)命令行模式 用户在用Vi编

2、辑文件时,最初进入的模式为命令行模式。在该模式中,可以通过上下移动光标进行“删除”、“复制”、“粘贴”等操作,但无法编辑文字。,4,3.1.1 Vi编辑器,(2)插入模式 在命令行模式下,按“I”或者“Insert”键都可以进入插入模式。在该模式下,用户可以进行文字的编辑输入。按“Esc”键可从插入模式切换到命令行模式。 (3)底行模式 在底行模式下,光标位于屏幕的底行。此时用户可以进行文件保存或退出操作,也可以设置编辑环境,如查找字符串、列出行号等。,5,3.1.1 Vi编辑器,二、vi的基本操作 1) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi my

3、file 不过有一点要特别注意,就是您进入vi之后,是处于命令行模式(command mode),您要切换到插入模式(Insert mode)才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到插入模式(Insert mode)再说吧!,6,3.1.1 Vi编辑器,2) 切换至插入模式(Insert mode)编辑文件 在命令行模式(command mode)下按一下字母i就可以进入插入模式(Insert mode),这时候你就可以开始输入文字了。 3) Insert 的切换 您目前处于插入模式(Insert mo

4、de),您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下ESC键转到命令行模式(command mode)再删除文字。,7,3.1.1 Vi编辑器,4) 退出vi及保存文件 在命令行模式(command mode)下,按一下:冒号键进入Last line mode,例如: : w filename (输入 w filename将文章以指定的文件名filename保存) : wq (输入wq,存盘并退出vi) : q! (输入q!, 不存盘强制退出vi),8,3.1.1 Vi编辑器,三、Vi各模式的功能键 (1)命令行模式常用的功能键 1)切换到插入模式 按

5、i切换进入插入模式insert mode,按i进入插入模式后是从光标当前位置开始输入文件; 按a进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按o进入插入模式后,是插入新的一行,从行首开始输入文字。 2)从插入模式切换为命令行模式 按ESC键。,9,3.1.1 Vi编辑器,3)移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母h、j、k、l,分别控制光标左、下、上、右移一格。 按ctrl+b:屏幕往后移动一页。 按ctrl+f:屏幕往前移动一页。 按ctrl+u:屏幕往后移动半页。 按ctrl+d:屏幕往前移动半页。 按数字0:移到光标所在行的行

6、首“ 按G:移动到文章的最后。 按$:移动到光标所在行的行尾。 按:移动到光标所在行的行首 按w:光标跳到下个字的开头 按e:光标跳到本字的字尾 按b:光标回到上个字的开头,10,3.1.1 Vi编辑器,4)删除文字 x:每按一次,删除光标所在位置的后面一个字符。 #x:例如,6x表示删除光标所在位置的后面6个字符。 X:大写的X,每按一次,删除光标所在位置的前面一个字符。 #X:例如,20X表示删除光标所在位置的前面20个字符。 dd:删除光标所在行。 #dd:从光标所在行开始删除#行,11,3.1.1 Vi编辑器,5)复制 yw:将光标所在之处到字尾的字符复制到缓冲区中。 #yw:复制#个

7、字到缓冲区 yy:复制光标所在行到缓冲区。 #yy:例如,6yy表示拷贝从光标所在的该行往下数6行文字。 p:将缓冲区内的字符贴到光标所在位置。注意:所有与y有关的复制命令都必须与p配合才能完成复制与粘贴功能。,12,3.1.1 Vi编辑器,6)替换 r:替换光标所在处的字符。 R:替换光标所到之处的字符,直到按下ESC键为止。 7)回复上一次操作 u:如果您误执行一个命令,可以马上按下u,回到上一个操作。按多次u可以执行多次回复。,13,3.1.1 Vi编辑器,8)更改 cw:更改光标所在处的字到字尾处 c#w:例如,c3w表示更改3个字 9)跳至指定的行 ctrl+g列出光标所在行的行号。

8、 #G:例如,15G,表示移动光标至文章的第15行行首。,14,3.1.1 Vi编辑器,(2)底行模式下常用的命令 在使用last line mode之前,请记住先按ESC键确定您已经处于command mode下后,再按:冒号即可进入last line mode。,15,3.1.1 Vi编辑器,1) 列出行号 set nu:输入set nu后,会在文件中的每一行前面列出行号。 set nonu 2) 跳到文件中的某一行 #:#号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。,16,3.1.1 Vi编辑器,3) 查找字符 /关键字

9、:先按/键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n会往后寻找到您要的关键字为止。 ?关键字:先按?键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n会往前寻找到您要的关键字为止。,17,3.1.1 Vi编辑器,4) 保存文件 w:在冒号输入字母w就可以将文件保存起来。 5) 离开vi q:按q就是退出,如果无法离开vi,可以在q后跟一个!强制离开vi。 wq:一般建议离开时,搭配w一起使用,这样在退出的时候还可以保存文件。,18,1emacs的简介,emacs文本编辑器可以用来编辑文本、剪辑和粘贴文本内容、提供个人日历和日记,阅读Usenet

10、新闻、发送电子邮件,同时还是一种程序语言解释器,可以编辑C、Lisp、Tev源代码文件、以及Linux的Shell。 emacs是由 Richard Stallman发明的,这位发明者还创建了自由软件基金会(Free Software Foundation,简称FSF)。最初的emacs是用来编辑宏命令的,现已进一步扩充为 UNIX用户中装机用户数量最大、功能最齐全的免费文本编辑器了。,3.1.2 Emacs编辑器,19,emacs同VI不一样,没有编辑状态和指令状态之分,其最重要的概念是其独特的缓冲区,emacs编辑的所有文件都是放在缓冲区中的,emacs支持同时编辑多个缓冲区,可以将一个文

11、件在多个缓冲区中打开不同的拷贝,甚至其所有的在线帮助和文档以及出错信息都是作为一个缓冲区来显示的,当然这些缓冲区是不可写的,用户可以在这些缓冲区之间拷贝和粘贴文本。并且一般所有的缓冲区在硬盘上都有一个以“#”开头的备份文件,这样在系统突然崩溃的时候可以即时将用户的工作进行备份。,3.1.2 Emacs编辑器,20,在编辑文件时,如果用户在编辑一些特殊类型的文件,例如当用户编辑扩展名为.c的C语言文件时,emacs会产生菜单选项c,向用户提供一些针对编辑c程序特别有用的一些命令。当用户编辑扩展名为.txt的文件则会多出菜单选项tex,让用户在编辑完tex文件后可以即时地观看输出并打印。首先介绍一

12、下几个常见的键盘操作符号的意义:所有的emacs的操作键都是由Control键(一般是键盘上的Ctrl键)和META键(一般是键盘上的Alt键)加上一些键的组合组成的,如果没有Alt键,则可以用输入一个Esc,再输入相应的键来代替。例如:,3.1.2 Emacs编辑器,21,C-x:表示同时按住Ctrl键和x键。 C x:表示先按住Ctrl键,然后释放它,再按下x键。 M-x:表示同时按住Alt键和x键。 M x:表示先按住Alt键,释放它,再按下x键。,3.1.2 Emacs编辑器,22,2emacs的启动和退出,emacs可以用两种方法启动。第一种启动emacs的方法是不装载任何文本文件启

13、动emacs,输入以下命令行:# emacs 在屏幕上会出现无任何文本emacs编辑窗口,如图所示。,如果用户是初学者,最好的学习方法是:按下Ctrl-h键(即按住Ctrl键后不放,再按下h字母键,23,第二种启动emacs的方法是通过装载某一个文本文件启动emacs,输入以下命令行: # emacs filename 如果装载的文件不在当前目录时必须输入该文件名的全称(包括所在目录)。例如,当前目录下有一个文本文件myfile.txt,用emacs对其编辑时,输入命令行启动emacs: # emacs myfile.txt 屏幕上将出现如图所示的emacs编辑窗口。,24,3emacs的基本

14、操作,(1)光标的移动 下面列出emacs中的光标的移动情况及其键盘操作: M-b:光标移动到光标左边的单词的开始处。 M-f:光标移动到光标右边的单词的开始处。 M-a:光标移动到当前句子的开始处。 M-e:光标移动到当前句子的结束处。 C-n:光标移动到下一行。 C-p:光标移动到上一行。 C-a:光标移动到行首。 C-e:光标移动到行尾。 M-:光标移动到文件尾。 M-:光标移动到文件头。,25,(2)文本的操作 插入文本的操作 删除文本的操作 取消操作 粘贴操作 查找和替换,(3)文件的操作,C-x C-f:在屏幕底部出列“Findfile:/_”等待用户输入文件名,如输入“/myfi

15、le.txt”则提示(newfile),清屏后光标出现在左上角,等待用户输入文本的内容。 C-x C-s:当将文本输入完毕后选择存盘操作,屏幕底部提示出文本所在的目录及文件名“/myfile.txt”,指示出该文件存放在磁盘何处。,26,C-x C-w:当对一个原有的文本文件继续编辑或修改后;需将改变后的文件重新保存。这时emacs会提示“/myfile.txt”exists;overwrite?(y or n)_当回答“y”后,提示信息“/myfile.txt”(重写该文件)。 C-x C-c:当确定结束对emacs编辑器的使用,可选择 File菜单中的Exitemacs选项退出emacs。

16、如果没有对输入或修改的内容存盘,emacs会提醒用户别忘记做保存文件操作。,(4)窗口的操作 窗口就是屏幕区域,用户可以使用多个窗口来对一个缓冲区的不同部分进行操作,或对不同的缓冲区进行操作。 当用户使用C-x C-f来打开一个文件的时候,emacs将会创建一个缓冲区,用户在其中进行编辑操作。emacs允许同时对多个缓冲区中的文本进行编辑,比如在缓冲区互相粘贴、剪辑等等。用户还可以直接输入快捷键(C-x C-b)查看所选择的是哪个缓冲区,如图9-4所示。,27,用户可以使用两种方法在当前窗口的不同缓冲区间进行切换: (1)使用Buffers菜单,它包括当前时刻打开的所有的缓冲区,在其中选择,就

17、能切换到想要编辑的文件。 (2)使用键盘对缓冲区进行操作,键入C-x b命令,然后按下RET(RET,即键盘上的回车键Enter。任何一个命令输入完毕时,必需紧跟着一个Enter,它的作用是用来告诉系统,命令输入已经结束,可以开始执行相关的动作了),就能立刻切换到位于当前编辑缓冲区的前一个缓冲区,或按Tab键,得到一个缓冲区的列表,然后输入需使用的缓冲区的名字(也可以用鼠标单击名字)。要关闭一个缓冲区,先切换到该缓冲区,键入C-x k,最后按下回车键。,28,4在emacs中执行Shell,在emacs中有两种执行shell的方法:一种是进入shell command mode,另一种是进入s

18、hell mode。二者都可以执行shell,其最大不同之处是,进入shell mode的状态,执行shell的同时,仍可以切换到其他模式处理别的工作,但如果使用shell command mode,就必须等shell执行完后才可以做其他的事。 使用shell command mode时,使用者在屏幕的最下方输入要执行的shell命令,emacs会开启一个名为“*shell command mode*”的窗口,将Shell命令执行的结果显示在此窗口中。shell mode则是执行一个子shell,其输入与输出都是通过同一个缓冲区,所以输入与输出是在同一个地方,它不像shell command

19、mode,命令输入与结果的显示在不同的地方。,29,1)shell command mode M-!(shell-command)启动shell command mode 2)shell mode M-x shell是启动shell mode的命令,4在emacs中执行Shell,30,5用emacs进行程序的编辑、编译与测试,emacs针对不同的语言提供不同的编译摸式。emacs提供的服务有程序缩进的安排、括号对应的提示、程序注解的安排、光标移动的方式与程序的删除等等。基本上,emacs是提供一个编写程序的格式,只是此格式可根据使用者的需要而自行设计。emacs选择适合的语言模式,是根据所编

20、辑的文件名称扩展名来判断的。像上面提到的那样,如果用户编辑扩展名为.c的C语言程序,emacs会自动给予C语言模式,而不需使用者自行处理。emacs提供的程序语言模式有LISP、SCHEME、C、C+、FORTRAN、MAKEFILE、AWK、PERL、ICON与 MUDDLE等。 编辑好的程序可以直接进入emacs的编译模式,不需离开emacs到Linux的shell下进行编译。进入emacs的编译模式很简单,只要输入“ESC(M)x compile”即可。emacs缺省的编译命今是make,执行 ESC x compile命令的结果如下所示: compile command:make -k

21、 如果要使用其他的编译器,只需在“compile command:”的后面加上对应的的编译命令即可,此命令与在Linux shell下使用编译的方法完全相同。,31,除了编辑、编译之外,程序开发者还需要的功能是调试器,emacs也提供了在编辑器内部调试程序的功能。emacs提供了四种调试器,分别为gdb、dbx、xdb与sdb,使用者可根据需要来选择合适的调试器。下面是使用调试器的命令: ESC X gdb RET file RET ESC X dbx RET file RET ESC X xdb RET file RET ESC X sdb RET file RET,32,使用Kdevelo

22、p开发C程序,1Kdevelop的简介,Kdevelop是一套功能强大的集成开发环境,其整合了开发程序所需的编译器、连接器、除错工具、版本控制工具等,可以用Kdevelop快速地建立各式各样的应用程序,包括: KDE程序;GNOME;Qt程序;终端程序;其它,33,2启动Kdevelop,如果是第一次使用Kdevelop,Kdevelop会先启动“Kdevelop设置”进行Kdevelop的环境设定,共需要完成9个步骤的设置工作,如图1所示。,单击“Kdevelop设置”欢迎画面对话框中的【下一步】按钮开始进行Kdevelop的设定。“Kdevelop设置”的第二项设定为“选择语法高亮风格”,

23、这里选择缺省的“Kdevelop 2.0 风格”,如图2所示。,图1 Kdevelop设置,图2 选择语法高亮风格,34,选择喜欢的语法高亮表示风格后,单击【下一步】按钮进入“用户交换界面模式”的选择窗口,如图3所示。,同样选择好用户交换界面模式后,单击【下一步】按钮进入“Kdevelop中所使用的工具检测窗口”,如图4所示。,图3 选择用户交换界面模式,图4 Kdevelop所使用的工具检测窗口,35,单击“工具程序检测窗口”对话框中的【下一步】按钮,进行下一个步骤。下一个步骤为“寻找Qt文档”,并设定文件路径,一般而言这个步骤应该会成功完成,将见到如图5所示对话框。,单击“寻找Qt文档”对

24、话框之中的【下一步】按钮,进入下一个步骤。下一个步骤为“寻找KDE程序库文件”,同样,一般而言这个步骤也应该会成功完成。再缺省完成两步以后,Kdevelop设置将显示“安装过程成功完成”的对话框,如图6所示,此为Kdevelop设置的最后步骤,单击【下一步】按钮,稍待一会Kdevelop便会启动。,图5 Qt文档查找,图6 安装过程成功完成窗口,36,3新建一个新项目,在Kdevelop中开发C程序,需要用创建项目的方式进行。请执行“项目/新建”命令,打开应用程序向导对话框,创建过程如图7所示。,选择要创建程序的种类,这里选择C程序,然后单击【下一步】按钮进行下一步骤。下一个步骤为关于项目资讯

25、的设定,如图8所示,在此输入项目的名称、目录、版本号码、作者姓名、以及作者电子邮件地址。,图7 选择创建程序的种类,图8 设定项目信息,37,单击【创建】按钮开始产生项目档案,结果如图9所示,此处可能会看到一些警告信息,但是一般而言并不影响项目的建立。,4修改项目,创建项目后,在Kdevelop窗口的左边选择源程序,开始编写程序。Kdevelop会将程序加上一些默认的内容,可视需求自行修改,如图10所示。,图9 产生项目档案的过程,图10修改项目,38,5项目的编译与执行,写好程序后,执行“建立-编译”命令进行程序的编译,如图11所示。如果程序没有出错,将看到Kdevelop下方的信息框之中显

26、示编译成功的信息。,接着便可以执行应用程序了,执行“建立-执行”命令进行程序的连接,如图12所示。若没有发生问题,就会在另一个窗口中看到程序的执行结果,如图13所示。,图11 编译应用程序,39,图12 执行应用程序,图13 应用程序的执行结果,一gcc的简介,Whats GCC GCC stands for “GNU Compiler Collection”. GCC is an integrated distribution of compilers for several major programming languages. These languages currently inc

27、lude C, C+, Objective-C, Objective-C+, Java, Fortran, and Ada.,3.2 GCC编译器,41,3.2 GCC编译器,The abbreviation GCC has multiple meanings in common use. The current official meaning is “GNU Compiler Collection”, which refers generically to the complete suite of tools. The name historically stood for “GNU C

28、 Compiler”, and this usage is still common when the emphasis is on compiling C programs.,42,3.2 GCC编译器,二、GCC编译流程,43,3.2 GCC编译器,三、GCC的常用选项 GCC的命令行格式:gcc options infile. 常用选项: -v 版本信息 Linux系统中可执行文件有两种格式。第一种 格式是a.out格式,这种格式用于早期的Linux系统 以及 Unix系统的原始格式。可执行和连接的格式(ELF)已经被Linux系统作为标准的格式采用,这 种格式很容易实现共享库。,44,

29、3.2 GCC编译器,-c 编译为目标文件,不连接库 -S 编译为汇编代码 -E 预处理.预处理之后的代码将送往标 准输出 -Wwarn. 设置警告,可以设置的警告开关很多,通常用-Wall开启所有的警告 -Olevel 设置优化级别,level可以是0,1,2,3或者s,默认为-O0,即不进行优化处理.(注意:在调试完成前尽量不要优化),45,3.2 GCC编译器,-g 产生调试信息. GDB能够使用这些调试信息。 -o outfile 指定输出文件的文件名,默认为a.out -mmachine-option. 指定所用的平台. 注意:Gcc也可以同时把多个源文件或者目 标文件编译成可执行文

30、件,-Idir. 把dir加到头文件的搜索路径中,而且gcc会在搜索标准头文件之前先搜索dir. -llibrary 在连接的时候搜索library库.库是一些archieve文件-其成员是目标文件.如果有文件引用library,library在命令行的位置应该在那个文件之后,因此,越底层的库越要放在后面.比如如果你要连接pcap库,那么你就需要使用-lpcap对源文件进行编译. -Ldir. 把dir加到库文件的搜索路径中,而且gcc会在搜索标准库文件之前先搜索dir.,3.2 GCC编译器,47,3.3 GDB调试器,Gdb是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。

31、它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行上停止执行. 它使你能一行行的执行你的代码. 注意: gdb程序调试的对象是可执行文件, 而不是程序的源代码文件。,48,3.3 GDB调试器,Gdb的使用方法: Gdb option executable-filecore-file or process-id gdb基本命令. file装入想要调试的可执行文件. cd命令:改变工作目录 pwd命令:返回当前工作日录 kill终止正在调试的程序 list列出产生执行文件的源代码的一

32、部分. next执行一行源代码但不进入函数内部.,49,3.3 GDB调试器,step 执行一行源代码而且进入函数内部. run 执行当前被调试的程序 quit 终止 watch 使你能监视一个变量的值而不管它何时被改变. break 在代码里设置断点, 这将使程序执行到这里时被挂起. make 使你能不退出 gdb 就可以重新产生可执行文件. shell 使你能不离开 gdb 就执行 UNIX shell 命令.,50,3.3 GDB调试器,display在应用程序每次停止运行时显示表达式的值. info break显示当前断点列表,包括每个断点到达的次数quit 终止 info files

33、显示调试文件的信息. info func显示所有的函数名. info local显示当前函数的所有局部变量的信息. info prog显示调试程序的执行状态 print显示表达式的值 delete删除断点.,示例程序Greeting.c #include ; static void my_print (char *); static void my_print2 (char *); main () char my_string = hello world!; my_print (my_string); my_print2 (my_string); ,void my_print (char *s

34、tring) printf (The string is %sn , string); void my_print2 (char *string) char *string2; int size, i; size = strlen (string); string2 = (char *) malloc (size + 1); for (i = 0; i size; i+) string2size - i = stringi; string2size+1 = 0; printf (The string printed backward is %sn , string2); ,53,3.4 工程管

35、理器 Make,Make 是用于自动编译、链接程序的实用工具。在开发一个项目时,通常是将项目分成许多功能模块,每个功能模块又可能被分成许多子模块,而这些子模块一般就是一个程序文件。小的项目通常都有十几个或者几十个文件,而大的项目则会有上百个甚至上千个文件。如果要一个一个的编译每个文件,这个工作是非常繁琐的,使用make 后就不需要手工的编译每个程序文件。除了要写一个makefile 文件外,通常所需要做的事情就是在命令行敲入“make”,然后所有的事情都由make 来完成。,54,3.4 工程管理器 Make,makefile的宗旨就是让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依

36、赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。 默认情况下,GNU make 工具在当前工作目录中按如下顺序搜索 makefile: * GNUmakefile * makefile * Makefile,可以使用其它文件名吗?,55,3.4 工程管理器 Make,一、Makefile的基本结构 一个简单的Makefile文件包含一系列的“规则”,其样式如下:目标(target) : 依赖(prerequiries)命令(command) 目标(target)通常是要产生的文件的名称,目标的例子是可执行文件或OBJ文件。目标也可是一个执行的动作名称,这样的目标

37、通常称为伪目标(PHONY)诸如clean 。依赖是用来输入从而产生目标的文件,一个目标经常有几个依赖。,56,3.4 工程管理器 Make,命令是Make执行的动作,一个规则可以含有 几个命令,每个命令占一行。 注意:每个命令行前面必须是一个Tab字符,即命 令行第一个字符是Tab。这是不小心容易出错的地 方。 注意:一个 makefile 文件中可定义多个目 标,利用 make target 命令可指定要编译 的目标,如果不指定目标,则使用第一个目 标。,57,3.4 工程管理器 Make,Makefile文件示例(From GNU make manual),edit : main.o k

38、bd.o command.o display.o insert.o search.o files.o utils.o gcc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o main.o : main.c defs.h gcc -c main.c kbd.o : kbd.c defs.h command.h gcc -c kbd.c command.o : command.c defs.h command.h gcc -c command.c display.o : display.c def

39、s.h buffer.h gcc -c display.c insert.o : insert.c defs.h buffer.h gcc -c insert.c,search.o : search.c defs.h buffer.h gcc -c search.c files.o : files.c defs.h buffer.h command.h gcc -c files.c utils.o : utils.c defs.h gcc -c utils.c clean : rm edit main.o kbd.o command.o display.o insert.o search.o

40、files.o utils.o,58,3.4 工程管理器 Make,二、make处理Makefile的过程 缺省情况下,make开始于第一个目标(假想目标 的名称前带.)。这个目标称为缺省最终目标(即 make最终更新的目标)。 在前面的例子中,缺省最终目标是更新可执行文件 edit,所以我们将该规则设为第一规则。这样,一旦 您给出命令:makemake就会读当前目录下的makefile文件,并开始 处理第一条规则。,59,3.4 工程管理器 Make,在本例中,第一条规则是连接生成edit,但 在make全部完成本规则工作之前,必须先处理edit 所依靠的OBJ文件。这些OBJ文件按照各自的

41、规则被处 理更新,每个OBJ文件的更新规则是编译其源文件。重 新编译根据其依靠的源文件或头文件是否比现存的OBJ 文件更新,或者OBJ文件是否存在来判断。 其它规则的处理根据它们的目标是否和缺省最终目 标的依赖相关联来判断。如果一些规则和缺省最终目标 无任何关联则这些规则不会被执行,除非告诉Make强 制执行(如输入执行make clean命令)。,60,3.4 工程管理器 Make,在OBJ文件重新编译之前,Make首先检查它的依赖C语言源文件和C语言头文件是否需要更新。如果这些C语言源文件和C语言头文件不是任何规则的目标,make将不会对它们做任何事情。 在OBJ文件重新编译(如果需要的话

42、)之后,make决定是否重新连接生成edit可执行文件。如果edit可执行文件不存在或任何一个OBJ文件比存在的edit可执行文件新,则make重新连接生成edit可执行文件。,61,3.4 工程管理器 Make,如果我们修改了insert.c文件,然后运行make,make将会编译insert.c文件更新insert.o文件,然后重新连接生成edit可执行文件。 如果我们修改了command.h文件, 然后运行make,make将会重新编译 kbd.o和command.o文件,然后重新 连接生成edit可执行文件。,62,3.4 工程管理器 Make,三、Makefile变量 为了简化编辑和

43、维护Makefile,make允 许在Makefile中创建和使用变量。变量是在 Makefile中定义的名字,用来代替一个文本字 符串,该文本字符串称为该变量的值。变量可 以用来替代目标体、依赖文件、命令及 makefile中的其他部分。如前面的makefile 例子可改写为如下形式:,63,3.4 工程管理器 Make,objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit : $(objects) gcc -o edit $(objects) main.o : main.c def

44、s.h gcc -c main.c kbd.o : kbd.c defs.h command.h gcc -c kbd.c command.o : command.c defs.h command.h gcc -c command.c display.o : display.c defs.h buffer.h gcc -c display.c insert.o : insert.c defs.h buffer.h gcc -c insert.c,search.o : search.c defs.h buffer.h gcc -c search.c files.o : files.c defs.

45、h buffer.h command.h gcc -c files.c utils.o : utils.c defs.h gcc -c utils.c clean : rm edit $(objects),64,3.4 工程管理器 Make,1)makefile中变量的定义方式和引用 GNU make中,一个变量的定义有两种 方式(或者称为风格)。我们把这两种方式 定义的变量可以看作变量的两种不同风格。 变量的这两种不同的风格的区别在于: 1. 定义方式; 2. 展开时机。下边我们分别对这两种不同的 风格进行详细地讨论。,65,3.4 工程管理器 Make,第一种风格的变量就是递归方式扩展的变

46、量。 这一类型的变量的定义是通过“=”或者使用指示符 “define”定义的变量。对这种变量的引用,在引用 的地方是严格的文本替换过程,此变量值的字符串原 模原样的出现在引用它的地方。如果此变量定义中存 在对其他变量的引用,这些被引用的变量会在它被展 开的同时被展开。就是说在变量定义时,变量值中对 其他变量的引用不会被替换展开。而是,变量在引用 它的地方进行替换展开的同时,它所引用的其它变量 才会被替换展开。,66,3.4 工程管理器 Make,foo = $(bar)bar = $(ugh)ugh = Huh?all: echo $(foo)执行“make”将会打印出“Huh?”。整个变量的

47、替换过程时这样的:首先“$(foo)”被替换为“$(bar)”,接下来“$(bar)”被替换为“$(ugh)”,最后“$(ugh)”被替换为“Hug?”。整个替换的过程是在执行“echo $(foo)”是进行的。,67,3.4 工程管理器 Make,在GNU make中可以使用另外一种风格的变量,我们将它称为“直接展开”式。这种风格的变量使用“:=”来定义变量。在使用“:=”定义变量时,变量值中对另外变量的引用或者函数的引用在定义时被展开(对变量进行替换)。所以在变量被定义以后就是一个实际所需要定义的文本串,其中不再包含任何对其它变量的引用。,68,3.4 工程管理器 Make,x := fo

48、oy := $(x) barx := later就等价于:y := foo barx := later需要注意的是:此风格变量在定义时就完成了对所引用的变量的展开,因此它不能实现对其后定义变量的引用。,69,3.4 工程管理器 Make,变量一旦定义之后,就可以通过将变量 名用圆括号包起来,并在前面加上$符号( $(var))来进行引用 。如果引用了一个未 定义的变量,则认为其值为空。 2)Makefile中常见的预定义变量和自动变 量,70,3.4 工程管理器 Make,自动变量 $*不包含扩展名的目标文件名称。$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$第

49、一个依赖文件的名称。$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。$目标的完整名称。$所有的依赖文件,以空格分开,不包含重复的依赖文件。$%如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则$为 mytarget.so,而$%为 image.o。,71,3.4 工程管理器 Make,常见的预定义变量 AR 归档维护程序的名称,默认值为 ar。ARFLAGS归档维护程序的选项。AS 汇编程序的名称,默认值为 as。ASFLAGS 汇编程序的选项。CC C 编译器的名称,默认值为 cc。CCFLAGSC

50、 编译器的选项。CPP C 预编译器的名称,默认值为 $(CC) -E。CPPFLAGSC 预编译的选项。CXXC+ 编译器的名称,默认值为 g+。CXXFLAGSC+ 编译器的选项。FC FORTRAN 编译器的名称,默认值为 f77。FFLAGSFORTRAN 编译器的选项。 RM 文件删除程序的名称,默认值为rm f,另一个例子,test:prog.o code.o gcc o test prog.o code.o prog.o:prog.c prog.h code.h gcc c prog.c o prog.o code.o:code.c code.h gcc c code.c o c

51、ode.o clean: rm f *.o,OBJS=prog.o code.o CC=gcc test:$ OBJS $ CC o $ $ prog.o:prog.c prog.h code.h $ CC c $ -o $ code.o:code.c code.h $CC c $ -o $ clean: $RM *.o,73,3.4 工程管理器 Make,四、Makfile规则 Makfile的规则是Make进行处理的依 据,它包括了目标体、依赖文件及其之间的 命令语句。 在Makefile中,还可以使用隐式规则和 模式规则。,例子,OBJS =hello.o CC = gcc hello:

52、 $(OBJS) $(CC) $ -o $ hello.o: hello.c stdio.h $(CC) c $ -o $,75,3.4 工程管理器 Make,在使用隐式规则时,只要把目标文件列出即可,不需要指定编译的具体细节。 使用隐式规则的“hello world”程序的makefile文件如下所示: OBJS =hello.o CC = gcc hello: $(OBJS) $(CC) $ -o $,76,3.4 工程管理器 Make),模式规则是用来定义多个文件的相同处理规则。其格式类似于普通规则,这个规则中相关文件前必须用“”标明。上例使用模式规则修改后的Makefile文件如下:

53、OBJS = hello.o CC = gcc hello: $(OBJS) $(CC) $ -o $ %.o : %.c $(CC) c $ -o $,77,3.4 工程管理器 Make,五、make的使用 usage:make options target 常见的选项: -C DIR 读取 makefile 之前改变到指定的目录 DIR。 -f FILE以指定的 FILE 文件作为 makefile。 -h显示所有的 make 选项。 -i忽略所有的命令执行错误。 -I DIR当包含其他 makefile 文件时,可利用该选项指定搜索目录。 -n只打印要执行的命令,但不执行这些命令。 -p

54、显示 make 变量数据库和隐含规则。 -s在执行命令时不显示命令。 -w在处理 makefile 之前和之后,显示工作目录。,78,3.5 使用Gnu Autotools,Gnu提供了一系列的工具用于帮助开发人员收集系统配置信息并自动生成Makefile文件。这套工具包括: 1、aclocal 2、autoscan 3、autoconf 4、autoheader 5、automake 注意:首先要确认系统是否装了以下工具(可以用 which命令进行查看),79,3.5 使用Gnu Autotools,Autotools的使用流程 第一步:手工编写Makefile.am这个文件 第二步:在源代

55、码目录树的最高层运行autoscan。然后手动修改configure.scan文件,并改名为configure.ac/configure.in。 第三步:运行aclocal,它会根据configure.ac的内容生成aclocal.m4文件。,80,3.5 使用Gnu Autotools,第四步:运行autoconf,它根据configure.ac和aclocal.m4的内容生成configure这个配置脚本文件。 第五步:运行automake -add-missing,它根据Makefile.am的内容生成Makefile.in。 第六步:运行configure,它会根据Makefile.i

56、n的内容生成Makefile这个文件。 获得Makefile文件后,我们就可以使用make程序来管理我们的工程了。,例子1,#include int main(int argc,char* argv)printf(%sn,Hello, World!)return 0;,Makefile.am,AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=hello hello_SOURCES=hello.c,把configure.scan文件更名为configure.in文件,并编译其内容如下: dnl Process this file with autoconf to pro

57、duce a configure script.AC_INIT(hello.c)dnl Add the file by leafAM_INIT_AUTOMAKE(hello,1.0)dnl Checks for programs.AC_PROG_CCdnl Checks for libraries.dnl Checks for header files.dnl Checks for typedefs, structures, and compiler characteristics.dnl Checks for library functions.AC_OUTPUT(Makefile),84,例子2,有一个简单的工程,其目录和文件结构如下所述:工程的最高层目录test中有一个hello.c文件和lib、include两个子目录。在lib目录中有一个print.c文件,在include目录中有一个print.h文件。 (1)为该工程编写automake的输入配置脚本Makefile.am. (2)请上机练习使用Gnu Autotools工具为该工程创建Makefile文件,并编译该工程。,85,hello.c的源代码,include “include/print.h” int main(void) print(“Hello,the Linux world!n”); re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论