《嵌入式linuxC语言开发工具.ppt》由会员分享,可在线阅读,更多相关《嵌入式linuxC语言开发工具.ppt(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式应用程序设计第二章第二章 嵌入式嵌入式Linux C语言程序开发工具语言程序开发工具 2.1嵌入式Linux下C语言概述 2.2 编辑器vim 2.3 编译器gcc 2.4 调试器GDB2.5 make工程管理器 2.6 autotools(不讲)2.7小结本章课程:本章课程:22.1嵌入式Linux下C语言概述嵌入式Linux程序设计以C语言为主体,还涉及到shell编程,php/python脚本编程等C语言最早是由贝尔实验室的Dennis Ritchie为了UNIX的辅助开发而编写的,它是在B语言的基础上开发出来的。尽管语言不是专门针对UNIX操作系统或机器编写的,但它与UNIX系统
2、的关系十分紧密。由于它的硬件无关性和可移植性,使C语言逐渐成为世界上使用最广泛计算机语言。ANSI C标准,流行的C语言编译系统以它为基础 32.1 嵌入式Linux下C语言概述C语言有如下特点:C语言是“中级语言”。它把高级语言的基本结构和语句与低级语言的实用性结合起来。可以像汇编语言一样对位、字节和地址进行操作。C语言是结构化的语言。C语言功能齐全。指针支持。C语言可移植性强。42.1嵌入式Linux下C语言概述嵌入式Linux C程序开发环境编辑器(vim)编译链接器(gcc)词法、语法和语义分析,中间代码的生成与优化,符号表管理,出错处理等调试器(gdb)项目管理工具(Make)自动化
3、控制与管理编译过程,使程序员将精力集中在代码编写上善于调试代码,解决Bug是优秀程序员的必备能力52.2 编辑器vim2.2.1 vi的基本模式2.2.2 vi的基本操作62.2.1 vi的基本模式标准模式(Normal mode)通常进入vim后默认处于标准模式(或者称为命令模式)。在此模式下任何键盘的输入都是作为命令来对待。命令的输入通常是不回显的,只显示执行的结果。插入模式(Insert Mode)用户只有在插入模式下才可以进行字符输入,用户按Esc键可回到命令行模式下。命令行模式(Command-line mode)在此模式下,用户可以将文件保存或退出vim,也可以设置编辑环境,如寻找
4、字符串、列出行号等。可视模式(Visual mode)在此模式下,通过移动光标选择文本,选中的文本将反白显示,这样提供高效、直观的编辑功能。用户按下ESC键可回到命令行模式。72.2.2 vi的基本操作1.vim的进入、保存和退出进入vim可以直接在命令终端下键入vim 文件名,vim可以自动载入所要编辑的文件或是开启一个新的文件。如在shell中键入vim hello.c(新建文件)则可进入vim环境。进入vi后屏幕左方会出现波浪符号,凡是具有该符号就代表此列目前是空的。此时进入的是命令行模式。要退出vim可以在命令行模式下键入“:q”(不保存并退出)或“:q!”(不保存并强制退出)或“:w
5、q”(保存并退出)指令则是保存之后再离开(注意冒号)。82.2.2 vi的基本操作命令类别命令说明编辑:e filename编辑文件名为filename的文件。若这个文件不存在,则会开启一个名为filename的新文件的编辑保存:w保存文件,文件应已有名字:w filename以文件名filename保存文件退出:q退出,如果文件已修改则不能退出:q!不保存强行推出,无论文件是否被修改:wq保存后退出92.2.2 vi的基本操作2.光标的移动除了使用标准光标键移动光标之外,vim还提供了很多复杂的光标移动方式。命令类别命令说明基本操作h,j,k,l分别等同于左方向键、下方向键、上方向键、右方向
6、健字操作w移至下一个单词的字首e移至下一个单词的字尾b移至上一个单词的字首行操作0移至行首$移至行尾G移至文件尾部gg移至文件首部H移至当前屏幕顶部M移至当前屏幕中间行的行首L移至当前屏幕底部最后一行的行首n-向上移动n行n+向下移动n行nG移至第n行页操作Ctrl+f屏幕往“上”翻动一页,等同于PageUpCtrl+b屏幕往“下”翻动一页,等同于PageDownCtrl+u屏幕往“上”翻动半页Ctrl+d屏幕往“下”翻动半页102.2.2 vi的基本操作3.文本编辑 文本编辑包括输入、修改、复制、粘贴、删除(可以用Del键和Backspace键)和恢复等操作。命令类别命令说明修改r修改光标所
7、在的字符,键入r后直接键入待修改字符R进入取代状态,在光标所指定的位置修改字符,该替代状态直到按下ESC键才结束复制yy复制光标所在行nyy复制光标所在行开始的n行,如3yy表示复制三行y复制光标至行首y$复制光标至行尾yw复制一个字(单词)yG复制光标文件尾y1G复制光标文件首粘贴p粘贴至光标后P粘贴至光标前删除x删除光标所在位置的一个字符X删除光标所在位置的前一个字符s删除光标所在的字符,并进入输入模式S删除光标所在的行,并进入输入模式dd删除光标所在的行ndd从光标所在行开始向下删除n行D删除至行尾,等同于d$dG删除至文件尾部d1G删除至文件首部,等同于dgg恢复u撤销上一步的操作。可
8、以多次撤销U在光标离开之前,恢复所有的编辑操作Ctrl+r返回至撤销操作之前的状态112.2.2 vi的基本操作4.查找与替换vim的查找和替换功能都支持正则表达式,可以匹配非常复杂的关键字,功能非常强大。类别命令说明查找/向下查找要查找的字符?向上查找要查找的字符n继续查找N反向查找替换:ranges/pattern/string/c,e,g,irange:指定查找的范围。例如1,$指替换范围从第0行到最后一行;s:指转入替换模式;pattern:指要被替换的字符串,可以用正则表达式;string:指替换的字符串;c:每次替换前询问;e:不显示错误;g:强制整行替换;i:不区分大小写12Vi
9、m的使用技巧重在积累132.3 编译器gcc 2.3.1 GCC的简介2.3.2 GCC的编译流程2.3.3 GCC的常用编译选项142.3.1 GCC的简介GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言gcc又是一个交叉平台编译器,支持的硬件平台很多,如alpha、arm、avr、hppa、i386、m68k、mips、powerpc、sparc、vxworks、x86_64、
10、MS Windows、OS/2等等。它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。152.3.1 GCC的简介gcc的编译流程分为了4个步骤,分别为:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)后 缀 名所对应的语言编 译 流 程.cC原始程序预处理、编译、汇编.C/.cc/.cxxC+原始程序预处理、编译、汇编.mObjective-C原始程序预处理、编译、汇编.i已经过预处理的C原始程序编译、汇编.ii已经过预处理的C+原始程序编译、汇编.s/.S汇编语言原始程序汇编.
11、h预处理文件(头文件)(不常出现在指令行).o目标文件链接.a/.so编译后的库文件链接16172.3.1 GCC的简介GCC使用的基本语法为:gcc option|filename182.3.2 GCC的编译流程预处理阶段处理的主要作用是通过预处理的内建功能对一些可预处理资源进行等价替换,最常见的可预处理资源有:文件包含、条件编译、布局控制和宏处理等。19文件包含:#include是最为常见的预处理,主要将指定的文件代码组合到源程序代码之中。条件编译:#if、#ifdef、#ifndef、#if defined、#endif、#undef等也是常用的预处理,主要是在编译时进行选择性编译,有效
12、地控制版本和编译范围,防止对文件的重复包含等重要功能。布局控制:#progma功能因后面的参数不同而不同,例如 使用#progma pack(1)可以内存变量的1个字节对齐,使得结构变量的成员分配到连续的内存块,等价于_attribute_(packed)。宏替换:#define的主要功能是定义符号常量、函数功能、重新命名、字符串符号的拼接等各种功能。其他的预处理有:#line是用于修改预定义宏_LINE_(当前所在的行号)和_FILE_(当前源文件的文件名);#error/#warning分别用于输出一个错误/警告信息;等等。20gcc的选项“-E”可以使编译器在预处理结束时就停止编译,选项
13、“-o”是指定GCC输出的结果,其命令格式为如下所示。gcc E o 目标文件目标文件 编译文件编译文件例如:例如:$gcc E o hello.i hello.c查看hello.i,分析宏处理212.3.2 GCC的编译流程编译阶段 编译器在预处理结束之后,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言,gcc的选项“-S”能使编译器在进行汇编之前就停止。由表2.6可知,“.s”是汇编语言原始程序,因此,此处的目标文件就可设为“.s”类型。$gcc S o hello.s hello.i222.3.2 GCC的编译流程汇编
14、阶段汇编阶段是把编译阶段生成的“.s”文件生成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示。$gcc c hello.s o hello.o232.3.2 GCC的编译流程链接阶段。完成了链接之后,gcc就可以生成可执行文件,其命令如下所示。$gcc hello.o o hello运行该可执行文件,出现正确的结果。$./hellohello,embedded world库函数printf的实现在中最简单的程序也用到了系统函数库(C运行时库)理解这个编译的过程是撰写Makefile的基础 242.3.3 gcc的常用编译选项的常用编译选项gcc有
15、超过100个的可用选项,包括总体选项、警告和出错选项、优化选项和体系结构等相关选项。(1)常用选项选项含义-c只编译汇编不链接,生成目标文件“.o”-S只编译不汇编,生成汇编代码-E只进行预编译,不做其他处理-g在可执行程序中包含标准调试信息-o file将file文件指定为输出文件-v打印出编译器内部编译各过程的命令行信息和编译器的版本-I dir在头文件的搜索路径列表中添加dir目录25-I的理解改为:#include“my.h”262.3.3 gcc的常用编译选项的常用编译选项(2)库相关选项选 项含 义-static进行静态编译,即链接静态库,禁止链接动态库-shared1可以生成动态
16、库文件2进行动态编译,尽可能地链接动态库,只有当没有动态库时才会链接同名的静态库(默认选项,即可省略)-L dir在库文件的搜索路径列表中添加dir目录-lname链接称为libname.a(静态库)或者libname.so(动态库)的库文件。若两个库都存在,则根据编译方式(-static还是-shared)而进行链接-fPIC(或-fpic)生成使用相对地址的位置无关的目标代码(Position Independent Code)。然后通常使用gcc的-shared选项从该PIC目标文件生成动态库文件。27使用函数库作为程序模块,动态库重用性强,升级方便函数库能够节省内存和存储器的资源静态库
17、(.a后缀)是一系列的目标文件的归档,静态链接时,静态库中的目标文件会被复制到程序的可执行文件中去动态库()不具有“复制”操作,程序运行时载入。动态库可以实现共享,也称为共享库,易于升级28静态库例子动态库例子动态库的搜索路径,LD_LIBRARY_PATH环境变量,/etc/软件依赖库,xxx-devel.rpm,包含了头文件和库文件理解-I,-L非常重要292.3.3 gcc的常用编译选项的常用编译选项(3)警告和出错选项选 项含 义-ansi支持符合ANSI标准的C程序-pedantic允许发出ANSI C标准所列的全部警告信息-pedantic-error允许发出ANSI C标准所列的
18、全部错误信息-w关闭所有警告信息-Wall允许发出gcc提供的所有有用的报警信息-werror把所有的警告信息转化为错误信息,并在警告发生时终止编译过程30写代码过程中,消除所有警告,保证代码规范312.3.3 gcc的常用编译选项的常用编译选项(4)优化选项gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3开发调试过程中,关闭优化 产品最终发行时,开启优化322.3.3 gcc的常用编译选项的常用编译选项(5)体系结构相关选项选 项含
19、 义-mcpu=type针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、pentium及i686等-mieee-fp使用IEEE标准进行浮点数的比较-mno-ieee-fp不使用IEEE标准进行浮点数的比较-msoft-float输出包含浮点库调用的目标代码-mshort把int类型作为16位处理,相当于short int-mrtd强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令332.4 调试器GDBGDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它是一种强大的命令行调试工具。一个合格的调试器需要有以下几项基本功能。能够运
20、行程序,设置所有能影响程序运行的参数。能够让程序让指定的条件下停止。能够在程序停止时检查所有参数的情况。能够根据指定条件改变程序的运行。Debug是一门艺术342.4.1 gdb使用流程使用流程进入GDB gdb test 查看文件l设置断点 b 6 查看断点处情况 info b 运行代码 r 查看变量值 p n/p i单步运行 n恢复程序运行 c观察变量 watch n 退出GDB q35例子362.4.2 gdb基本命令基本命令1工作环境相关命令命 令 格 式含 义set args运行时的参数指定运行时参数,如set args 2show args查看设置好的运行参数path dir设定程
21、序的运行路径show paths查看程序的运行路径set environment var=value设置环境变量show environment var查看环境变量cd dir进入到dir目录,相当于shell中的cd命令pwd显示当前工作目录shell command运行shell的command命令372.4.2 gdb基本命令基本命令2设置断点与恢复命令命 令 格 式含 义info b查看所设断点break 文件名:行号或函数名 设置断点tbreak 文件名:行号或函数名 设置临时断点,到达后被自动删除delete 断点号删除指定断点,其断点号为“info b”中的第一栏。若缺省断点号则
22、删除所有断点disable 断点号停止指定断点,使用“info b”仍能查看此断点。同delete一样,若缺省断点号则停止所有断点enable 断点号激活指定断点,即激活被disable停止的断点condition 断点号 修改对应断点的条件ignore 断点号在程序执行中,忽略对应断点num次step单步恢复程序运行,且进入函数调用next单步恢复程序运行,但不进入函数调用finish运行程序,直到当前函数完成返回c继续执行函数,直到函数结束或遇到新的断点382.4.2 gdb基本命令基本命令3gdb中源码查看相关命令命 令 格 式含 义list|查看指定位置代码file 文件名加载指定文件
23、forward-search 正则表达式源代码的前向搜索reverse-search 正则表达式源代码的后向搜索dir DIR将路径DIR添加到源文件搜索的路径的开头show directories显示源文件的当前搜索路径info line显示加载到gdb内存中的代码392.4.2 gdb基本命令基本命令4gdb中查看运行数据相关命令命 令 格 式含 义print 表达式|变量查看程序运行时对应表达式和变量的值x address查看内存变量内容。其中n为整数表示显示内存的长度,f表示显示的格式,u表示从当前地址往后请求显示的字节数display 表达式设定在单步运行或其他情况中,自动显示的对应
24、表达式的内容backtrace或bt查看当前栈侦的情况,即可以查到哪些被调用的函数尚未返回。frame n打印第n个栈侦info reg/stack查看寄存器/堆栈使用情况up 调到上一层函数,即上移栈帧down与up相对,即下移栈帧40f ormat:x,u,d,o,s,Size(单位)u,b,h,w,g412.4.2 gdb基本命令基本命令5gdb中修改运行参数相关命令gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set 变量设定值”。422.4.3 gdbserver远程调试远程调试使用交叉调试工具实现远程调试。gdb
25、调试器提供了两种不同的远程调试方法,即stub(插桩)方式和gdbserver方式。gdbserver本身的体积很小,能够在具有很小内存的目标系统上独立运行,因而非常适合嵌入式开发。stub方式则需要通过链接器把调试代理和要调试的程序链接成一个可执行的应用程序文件,而且stub需要修改异常处理和驱动程序等。gdbserver要求宿主机和目标系统采用同一系列的操作系统,而stub没有这种限制,甚至目标系统可以没有操作系统。gdbserver比较适合于调试嵌入式平台上的应用程序,而stub比较适合于调试bootloader和内核等系统程序。432.4.3 gdbserver远程调试远程调试用gdb
26、+gdbserver的方式调试嵌入式平台上的Linux应用程序 安装arm-linux-gdb安装gdbserver 远程调试上机过程中演示讲解442.5 make工程管理器 2.5.1 Makefile基本结构 2.5.2 Makefile变量 2.5.3 Makefile规则 2.5.4 make管理器的使用45大的代码量(*.c,*.h)希望有一个方法,可以自动识别发生更新的文件,避免输入繁琐的命令来完成编译让程序员把注意力放在“代码本身”,而不是“编译代码”上462.5.1 Makefile基本结构在一个Makefile中通常包含如下内容。需要由make工具创建的目标体(target)
27、,目标体通常是目标文件、可执行文件或是一个标签。要创建的目标体所依赖的文件(dependency_file)。创建每个目标体时需要运行的命令(command)。它的格式为:target:dependency_files commandcommand必须与Tab键开头执行make与make target_nameMakefile 与 makefile47P43的例子分析依赖关系48Makefile中的变量自定义变量预定义变量自动变量环境变量变量名变量名能包含“:”“#”“=”如何引用变量名“=”与“:=”492.5.2 Makefile变量 命 令 格 式含 义AR库文件维护程序的名称,默认值为
28、arAS汇编程序的名称,默认值为asCCC编译器的名称,默认值为ccCPPC预编译器的名称,默认值为$(CC)ECXXC+编译器的名称,默认值为g+FCFORTRAN编译器的名称,默认值为f77RM文件删除程序的名称,默认值为rm fARFLAGS库文件维护程序的选项,无默认值ASFLAGS汇编程序的选项,无默认值CFLAGS C编译器的选项,无默认值CPPFLAGSC预编译的选项,无默认值CXXFLAGSC+编译器的选项,无默认值FFLAGSFORTRAN编译器的选项,无默认值Makefile中常见预定义变量 502.5.2 Makefile变量命 令 格 式含 义$*不包含扩展名的目标文件
29、名称$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件$第一个依赖文件的名称$?所有时间戳比目标文件晚的依赖文件,并以空格分开$目标文件的完整名称$所有不重复的依赖文件,以空格分开$%如果目标是归档成员,则该变量表示目标的归档成员名称Makefile中常见自动变量 512.5.3 Makefile规则隐式规则 隐含规则能够告诉make怎样使用传统的技术完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可。make会自动搜索隐式规则目录来确定如何生成目标文件。make的隐式规则指出:所有“.o”文件都可自动由“.c”文件使用命令“$(CC
30、)$(CPPFLAGS)$(CFLAGS)-c file.c o file.o”生成。522.5.3 Makefile规则隐式规则 对应语言后缀名规 则C编译:.c变为.o$(CC)c$(CPPFLAGS)$(CFLAGS)C+编译:.cc或.C变为.o$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)Pascal编译:.p变为.o$(PC)-c$(PFLAGS)Fortran编译:.r变为-o$(FC)-c$(FFLAGS)。Makefile中常见隐式规则目录一个.c 对应 一个.h532.5.3 Makefile规则模式规则 模式规则不同于隐式规则,是用来定义相同处理规则的多个文
31、件的,模式规则能引入用户自定义变量,为多个文件建立相同的规则,简化Makefile的编写。模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。OBJS=kang.o yul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)$(CC)$-o$%.o:%.c$(CC)$(CFLAGS)-c$-o$542.5.4 make使用命 令 格 式含 义-C dir读入指定目录下的Makefile-f file读入当前目录下的file文件作为Makefile-i忽略所有的命令执行错误-I dir指定被包含的Makefile所在目录-n只打印要执行的命令,但不执行这些
32、命令-p显示make变量数据库和隐含规则-s在执行命令时不显示命令-w如果make在执行过程中改变目录,打印当前目录名55Iptraf软件的Makefile56在网上查询一下,如何写一个智能的Makefile,添加一个.c文件与.h文件,无需编辑Makefile用Make管理大型项目是比较复杂的,支持协同开发Shell脚本环境变量57Linux下的GNU软件大都用autotools来制作Makefile自己动手编译一个软件源代码解压./configure收集系统信息,定制配置(./configure help)生成Makefileconfig.log,config.hmakemake inst
33、allmake cleanmake dist582.7 实验内容2.7.1 vim使用练习2.7.2 用gdb调试程序的bug2.7.3 编写包含多文件的makefile592.7.1 vim使用练习实验目的通过指定指令的vim操作练习,使读者能够熟练使用vim中的常见操作,并且熟悉vim的几种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vim的操作已经很熟练了。实验内容(11)将光标移动到最后一行的行尾。(12)粘贴复制行的内容。(13)光标移到“si:sysinit:/etc/rc.d/rc.sysinit”。(14)删除该行。(15)存盘但不退出。(16)将光标移到首行。(
34、17)插入模式下输入“Hello,this is vi world!”。(18)返回命令行模式。(19)向下查找字符串“0:wait”。(20)再向上查找字符串“halt”。(21)强制退出vim,不存盘。(1)在“/root”目录下建一个名为“vim”的目录。(2)进入“vim”目录。(3)将文件“/etc/inittab”复制到“vim”目录下。(4)使用vim打开“vim”目录下的inittab。(5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。(6)将光标移到该行。(7)复制该行内容。(8)将光标移到最后一行行首。(9)粘贴复制行的
35、内容。(10)撤销第9步的动作。分别指出每个命令处于何种模式下?602.7.2 用gdb调试程序的bug实验目的通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,希望读者认真调试。实验内容(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。(3)运行生成的可执行文件,观察运行结果。(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。(5)纠正错误,更改源程序并
36、得到正确的结果。612.7.3 编写包含多文件的makefile实验目的通过对包含多文件的makefile的编写,熟悉各种形式的makefile,并且进一步加深对makefile中用户自定义变量、自动变量及预定义变量的理解。实验内容(1)用vi在同一目录下编辑两个简单的hello程序(2)仍在同一目录下用vim编辑makefile,且不使用变量替换,用一个目标体实现(即直接将hello.c和hello.h编译成hello目标体)。然后用make验证所编写的makefile是否正确。(3)将上述makefile使用变量替换实现。同样用make验证所编写的makefile是否正确。(4)编辑另一个
37、makefile,取名为makefile1,不使用变量替换,但用两个目标体实现(也就是首先将hello.c和hello.h编译为hello.o,再将hello.o编译为hello),再用make的“-f”选项验证这个makefile1的正确性。(5)将上述makefile1使用变量替换实现。622.8 本章小结本章是Linux中C语言编程开发的基础,首先讲解了Linux平台下C语言编程的基本概念。接下来,本章介绍了Linux中常见的编辑器vim,并且主要讲解vim的4种模式和基本操作。再接下来,本章介绍了gcc编译器的使用、函数库的创建与使用以及gdb的本地/远程调试的方法,并结合具体的实例进行讲解。虽然它们的选项比较多,但是常用的并不多,读者着重掌握笔者例子中使用的一些选项即可。之后,本章又介绍了make工程管理器的使用,这里包括makefile的基本结构、makefile的变量定义及其规则和make的使用。后面讲解常用的集成开发环境Eclipse的安装和使用方法。最后介绍的是makefile的自动生成器autotools的使用。本章的实验包括了vim、gcc、gdb、makefile、autotool的使用,由于这些都是Linux中的常用软件,因此希望读者切实掌握。63
限制150内