1、Linux程序设计教程第2章Linux系统开发环境2第2章Linux下项目开发环境n2.1 Vi编辑器n2.2 GCC编译器n2.3 Makefile文件的使用n2.4 GDB调试器n2.5 库n2.6 案例2:简易学生成绩计算32.1 Vi编辑器nvi的工作模式 nvi的基本用法nvi的高级用法42.1 Vi编辑器nvi三种模式插入模式:键盘按键被当作文本命令模式:键盘按键被当作命令底行模式:输入“:”“?”“/”后进入,完成某些功能。52.1 Vi编辑器nvi的基本用法启动n命令提示符后输入“vi 文件名”以下所说的vi的用法都是在命令模式下,所以在插入模式时要先Esc退出编辑状态。保存不
2、退出 n:w另存为 n:w 新文件名退出n:wq 保存并退出n:q!不保存退出62.1 Vi编辑器nvi的高级用法文本操作n复制 yy yw nyy nywn剪切 dd dw ndd ndwn粘贴 p P72.1 Vi编辑器nvi的高级用法行数n跳转到某行 数字G n底行模式,set nu 显示行号 set nonu取消显示行号撤销 nu重做 n.(句点)搜索 n/?82.2 GCC编译器nGCC编译器介绍功能强大的编译器,源代码到可执行文件有4个步骤:处理头文件和预编译语句,生成.i文件 生成.s汇编代码文件 将编译阶段生成的.s文件转换成目标文件.o 将目标文件和所用的库函数连接到可执行文
3、件中适当位置,生成可执行文件源代码.ccppcc1asld预处理编译汇编连接92.2 GCC编译器nGCC的基本用法基本格式:pgcc 选项 源文件名,如ex1.c生成可执行文件pgcc -o 可执行文件名 源文件名p或gcc 源文件名 -o 可执行文件名要用GDB工具调试p最后加上-g选项显示附加的警告信息p最后加上-Wall选项102.3 Makefile文件的使用nmake对于大型的开发项目来说,可能包括很多源文件,使用make和makefile文件可以清晰地理顺各个源文件之间的关系。make主要是通过make命令调用makefile文件,通过makefile文件描述源程序之间的相互依赖
4、关系,并自动维护编译工作。n调用格式“make 目标”,查找makefile文件中指定的目标一般都省略目标直接用make来查找makefile文件中的第一个目标。112.3 Makefile文件的使用nmakefile文件内容显式规则隐含规则变量定义指示符注释:#后为注释,行注释122.3 Makefile文件的使用n显式规则格式:目标:依赖 tab命令 注意:tab位置按键盘上的tab键n举例p如果hello不存在则进行编译。p如果hello日期没有hello.c日期新则进行编译。hello:hello.c gcc o hello hello.c132.3 Makefile文件的使用n变量类
5、似C语言的宏,大小写敏感(推荐大小写搭配名字)$,$.$等都是自动化变量n$目标文件n$所有依赖文件声明时赋初值,使用时变量名前加$,最好用()将名字括起。如:OBJ=test.o fun1.o fun2.otest:$(OBJ)gcc o$142.3 Makefile文件的使用nmake执行过程当前目录下按照GNUmakefile、makefile、Makefile的顺序查找makefile文件查找文件中的第一个目标文件如edit。若edit不存在,edit后依赖的文件都存在,并且edit修改时间比依赖文件的时间早,则会执行命令。若edit依赖的.o文件不存在,则在当前文件中查找目标为依赖文
6、件的规则,生成.o文件。通常clean伪目标是用来清除中间文件的,而不是要生成clean文件。一般的makefile文件都加入clean。152.4 GDB调试器n错误分类编译错误:gcc时出现错误p根据错误提示找到错误,从第一个错误开始找。p到网上搜索错误提示p总结编译错误的解决方法运行错误:gcc正确,运行时出现错误p调试器:GDBp打印调试p在程序适当位置加printf提示语句(记得printf中加n)p在调用函数后根据函数返回值结合perror查找错误162.4 GDB调试器nGDB工具GNU的调试器(debugger),字符模式。n设置断点n监视变量值n单步执行n修改变量的值172.
7、5 库n库的概念库函数,由系统提供的,供程序员开发时调用的,完成特定功能的函数。如printf等,一般是.o目标代码。p便于编程p隐藏细节,降低开发难度和开发周期p商业软件,保护知识产权存放函数的文件就像存放函数的仓库,如Glibc库,提供了系统调用和C库的基本函数。Linux下库的形式:静态库、共享库。182.5 库n静态库p一般以.a结尾,libtest.ap编译时:库函数被合并在可执行文件中p执行时:提供可执行文件即可p可执行文件会变大,适合于小程序调用n共享库p一般以.so或.so.x结尾,x代表版本,如libtest.so.1p编译时:库文件不被合并入可执行文件p执行时:提供可执行文
8、件和库文件才能执行p可执行文件会比较小,并且几个可执行文件可以共享库,适合于大型项目。192.5 库n静态库的创建与使用创建pgcc -c libhello.cp生成目标文件libhello.opar rc libhello.a libhello.op生成静态库libhello.a使用p在usehello.c中调用库函数print_hellopgcc -o usehello_static usehello.c libhello.ap生成的可执行文件usehello_static,可以直接运行。202.5 库n共享库的创建与使用创建ngcc fPIC -c libhello.c生成目标文件lib
9、hello.ongcc -shared -o libhello.so libhello.o生成共享库libhello.so使用n共享库默认搜索路径是/usr/lib或/lib,拷贝过去 cp libhello.so /usr/libn使用动态链接库gcc-o usehello_dynamic usehello.c lhellon或者不拷贝直接使用以下命令编译gcc-o usehello_dynamic usehello.c L ./lhello212.5 库n共享库的创建与使用创建ngcc fPIC -c libhello.c生成目标文件libhello.ongcc -shared -o li
10、bhello.so libhello.o生成共享库libhello.so使用n共享库默认搜索路径是/usr/lib或/lib,拷贝过去 cp libhello.so /usr/libn使用动态链接库gcc-o usehello_dynamic usehello.c lhellon或者不拷贝直接使用以下命令编译gcc-o usehello_dynamic usehello.c L ./lhello222.6案例2:简易学生成绩计算n分析与设计n本项目完成一个简易的学生成绩计算功能:从键盘输入N个学生的姓名,年龄,数学成绩,语文成绩四项信息,输入完N个学生信息后,计算各个学生的总成绩和平均成绩,计算完毕后输出每个学生的姓名、年龄、数学成绩、语文成绩、总成绩、平均成绩。要求将输入、计算、输出三个过程分别使用独立函数实现,三个函数分别保存在三个不同的源文件中。232.6案例2:简易学生成绩计算n见教材。谢谢!