《《linux软件工程师C语言实用教程》第1章.ppt》由会员分享,可在线阅读,更多相关《《linux软件工程师C语言实用教程》第1章.ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 1 章章Linux系统程序设计基础系统程序设计基础本章重点 q编辑、编译及运行Linux c程序qgcc编译器的使用qgdb调试器的使用21.1 第一个第一个Linux c程序程序 例例1-1:设设计计一一个个程程序序,要要求求在在屏屏幕幕上上输输出出“这这是是第一个第一个Linux c程序程序!”。步骤步骤 1:设计编辑源程序代码设计编辑源程序代码q使用文本编辑器使用文本编辑器vim,在终端中输出,在终端中输出:rootlocalhost root#vim q输入完成后存盘:按输入完成后存盘:按ESC键键输入输入“:wq”回车回车 31.1 第一个第一个Linux c程序程序步骤步骤
2、2:编译程序q查看当前目录下是否有文件,输入命令:rootlocalhost root#lsq编译:编译:rootlocalhost root#gcc 1-1.c -o 1-1rootlocalhost root#步骤步骤 3:运行程序rootlocalhost root#ls1-1.c 1-1rootlocalhost root#./1-1这是第一个Linux c程序!41.1 第一个第一个Linux c程序程序qLinux下的文本编辑器软件主要有vim、gedit和Emacs,Linux下的c编译器中,gcc是功能最强大、使用最广泛的软件。qgcc编译的常用格式为:gcc C源文件 -o
3、目标文件名或:gcc -o 目标文件名 C源文件 或:gcc 目标文件名 最后一种情况目标文件名默认为:51.1 第一个第一个Linux c程序程序qprintf函数说明 思考题:设计一个程序,要求在屏幕上输出思考题:设计一个程序,要求在屏幕上输出:*61.2 gcc编译器 qgcc是(GNU Cmpiler Collection的简称),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的程序。qgcc不仅功能十分强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。qg
4、cc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比,平均效率要高20%30%。qgcc支持编译的后缀名:71.2.1 使用使用gccqgcc指令的一般格式为:gcc 参数 要编译的文件 参数 目标文件q例例1-2:设计一个程序,要求把输入的百分制的成绩转换成五级制输出。即输入成绩大于等于90分,显示“优秀”;若成绩介于8090分,显示“良好”;若成绩介于7080分,显示“中等”;若成绩介于6070分,显示“及格”;若成绩小于60分,显示“不及格”。81.2.1 使用使用gccq步骤步骤 1:编辑源程序代码 rootlocalhost root#vim91.2.
5、1 使用使用gccq步骤步骤 2:用gcc编译程序rootlocalhost root#gcc 1-2.c o 1-2q步骤步骤 3:运行程序运行程序rootlocalhost root#./1-2思考题:设计一个程序,要求输入一个数,如思考题:设计一个程序,要求输入一个数,如果此数大于果此数大于0,显示,显示“输入的为正数输入的为正数”,否则显,否则显示示“输入的为负数输入的为负数”。101.2.2 gcc编译流程编译流程111.2.2 gcc编译流程编译流程q例例1-3:设计一个程序,要求输入两个整数,求和输出。通过使用gcc的参数,控制gcc的编译过程,了解gcc的编译过程,进一步认识g
6、cc的灵活性。q步骤步骤 1:编辑源程序代码rootlocalhost root#vim121.2.2 gcc编译流程编译流程q步骤步骤 2:预处理阶段rootlocalhost root#gcc 1-3.c o 1-3.i Erootlocalhost root#vim q步骤步骤 3:编译阶段编译阶段rootlocalhost root#gcc 1-3.i o 1-3.s q步骤步骤 4:汇编阶段rootlocalhost root#gcc 1-3.s o 1-3.o c131.2.2 gcc编译流程编译流程q步骤步骤 5:链接阶段qLinux系统把printf和scanf函数的实现,都放
7、在了的库文件中。在没有参数指定时,gcc到系统默认的路径“/usr/lib”下查找,链接到库函数中去,这样就有了printf和scanf函数的实现部分。把程序中一些函数的实现,这是链接阶段的工作。q完成链接后,gcc就可以生成可执行程序文件 注意:注意:gcc在编译的时候默认使用动态链接库,在编译的时候默认使用动态链接库,编译链接时并不把库文件的代码加入到可执行编译链接时并不把库文件的代码加入到可执行文件中,而是在程序执行的时候动态加载链接文件中,而是在程序执行的时候动态加载链接库库,这样可以节省系统开销。这样可以节省系统开销。141.2.2 gcc编译流程编译流程qscanf函数说明 151
8、.2.3 gcc编译器的主要参数编译器的主要参数1.总体参数总体参数q当头文件与当头文件与gcc不在同一目录下要用不在同一目录下要用-I dir编译,编译,它是指头文件,而添加库文件时需用它是指头文件,而添加库文件时需用-L dir参数。参数。161.2.3 gcc编译器的主要参数编译器的主要参数q例例1-4:设计一个程序,要求把输入的字符串原样输出,程序中的头文件自己定义,源程序文件为“1-4.c”,自定义的头文件为“”,放在目录“/root”下。q步骤步骤 1:设计编辑源程序代码rootlocalhost root#vim171.2.3 gcc编译器的主要参数编译器的主要参数q步骤步骤 2
9、:设计编辑自定义的头文件rootlocalhost root#vim q步骤步骤 3:正常编译文件:rootlocalhost root#gcc 1-4.c o 1-4编译器提示出错。q步骤步骤 4:加“-I dir”参数编译:rootlocalhost root#gcc 1-4.c o 1-4 I /root注意:在include语句中,“”表示在默认路径“/usr/include”中搜索头文件,引号“”表示在本目录中搜索。因此,前面例子中把中的“#include”改成“#include“”,就不需要“-I dir”参数也能正确编译了。181.2.3 gcc编译器的主要参数编译器的主要参数q
10、getchar函数说明 qputchar函数说明 思考题:此例能不能用前面的思考题:此例能不能用前面的printf函数和函数和scanf函函数?如果可以,要如何改写程序?数?如果可以,要如何改写程序?191.2.3 gcc编译器的主要参数编译器的主要参数q例例1-5:有程序用到目录“/root/lib”下的一个动态库。rootlocalhost root#gcc 1-5.c o 1-5.c L/root/lib lsunqqLinux下的库文件命名时有一个规定:必须以下的库文件命名时有一个规定:必须以l、i、b三个字母开头,因此,在用三个字母开头,因此,在用“-l”指定链接指定链接库文件时可以
11、省去库文件时可以省去l、i、b三个字母。也就是说三个字母。也就是说“-llibsunq”有时候写成有时候写成“-lsunq”。201.2.3 gcc编译器的主要参数编译器的主要参数q例例1-6:设计一个程序,要求把输入的数字作为X轴坐标,算出它的sin值。q步骤步骤 1:编辑源程序代码rootlocalhost root#vim211.2.3 gcc编译器的主要参数编译器的主要参数q步骤步骤 2:用gcc编译程序rootlocalhost root#gcc 1-6.c o 1-6结果发现编译器报错:原因是需要指定函数的具体路径,要查找函数sin,输入:rootlocalhost root#nm
12、-o/lib/*.so|grep sin221.2.3 gcc编译器的主要参数编译器的主要参数q在/lib/libm-2.3.2.so:00008610 W sin中除去函数库头lib及函数的版本号,所余下的符号为“m”,在编译时用字符“l”与余下的符号“m”相连接成“lm”,在编译时加上此参数就能正确地通过编译,即:rootlocalhost root#gcc 1-6.c o 1-6 -lmq步骤步骤 3:运行程序rootlocalhost root#./1-6注意:Linux下动态链接库默认后缀名“.so”,静态链接库默认后缀名“.a”。231.2.3 gcc编译器的主要参数编译器的主要参
13、数qgcc的常用告警和出错参数 241.2.3 gcc编译器的主要参数编译器的主要参数q例例1-7:设计一个程序,要求打印“这是一段用于测试的垃圾程序!”,里面包含一些非标准语法。q步骤步骤 1:设计编辑源程序代码 rootlocalhost root#vim 251.2.3 gcc编译器的主要参数编译器的主要参数q步骤步骤 2:关闭所有告警rootlocalhost root#gcc 1-7.c o 1-7 wq步骤步骤 3:显示不符合ANSI c标准语法的告警信息rootlocalhost root#gcc 1-7.c o 1-7 ansiq步骤步骤 4:允许发出ANSI c标准所列的全部
14、警告信息rootlocalhost root#gcc 1-7.c o 1-7 pedanticq步骤步骤 5:允许发出gcc提供的所有有用的告警信息rootlocalhost root#gcc 1-7.c o 1-7 Wall261.2.3 gcc编译器的主要参数编译器的主要参数q优化参数优化参数1.代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。2.gcc提供的代码优化功能非常强大,它通过编译参数“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。3.通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快
15、。271.2.3 gcc编译器的主要参数编译器的主要参数q例例1-8:设计一个程序,要求循环8亿次左右,每次都有一些可以优化的加减乘除运算。比较gcc的编译参数“-On”优化程序前后的运行速度。q步骤步骤 1:编辑源程序代码:281.2.3 gcc编译器的主要参数编译器的主要参数q步骤步骤 2:不加任何优化参数进行编译。rootlocalhost root#gcc 1-8.c o 1-8q步骤步骤 3:用用time命令大致统计出该程序在运行时所命令大致统计出该程序在运行时所需要的时间。需要的时间。rootlocalhost root#time ./1-8q步骤步骤 4:加加“-O2”优化参数进
16、行编译。优化参数进行编译。rootlocalhost root#gcc 1-8.c o 1-8 O2q步骤步骤 5:再统计优化后的程序运行时所需要的时间。再统计优化后的程序运行时所需要的时间。rootlocalhost root#time ./1-8q步骤步骤 6:对比两次执行的输出结果。291.2.3 gcc编译器的主要参数编译器的主要参数q优化虽然能够给程序带来更好的执行性能,但在一些场合中应该避免优化代码。1.程序开发的时候。2.资源受限的时候。3.跟踪调试的时候。301.3 gdb调试器调试器1.gdb概述概述qLinux下的gdb调试器,是一款GNU组织开发并发布的UNIX/Linu
17、x下的程序调试工具。它没有图形化的友好界面,但功能强大。q在进行应用程序的调试之前,要注意的是gdb进行调试的是可执行文件,而不是如“.c”这样的源代码文件。因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。311.3 gdb调试器调试器2.使用使用gdb调试程序调试程序q例例1-9:设计一个程序,要求输入两个整数,判:设计一个程序,要求输入两个整数,判断并输出其中的最小数。断并输出其中的最小数。q步骤步骤 1:编辑源程序代码:编辑源程序代码:321.3 gdb调试器调试器q步骤步骤 2:用gcc编译程序rootlocalhost root#gcc 1-9.c o 1-9 gq步骤
18、步骤 3:进入gdb调试环境rootlocalhost root#gdb 1-9注意:注意:gdb是命令行是命令行调试环境,境,调试程序都在提示符程序都在提示符“(gdb)”后后输入相入相应的命令,的命令,gdb的命令很多,可以在的命令很多,可以在提示符提示符“(gdb)”后后输入入help进行行查找。找。q常用的gdb命令 331.3 gdb调试器调试器q步骤步骤 4:用gdb调试程序(1)查看源文件q在gdb中输入“l”(list)就可以查看程序源代码,一次显示10行;注意:注意:gdb命令命令“l”(list)列出源代列出源代码的的时候,要确保原来的源程序候,要确保原来的源程序还在,如果
19、在,如果读者以者以为这象反象反汇编一一样给出代出代码,那那就就错了,其了,其实只是列出源文件的内容。只是列出源文件的内容。特特别提示:提示:“list”+行号:行号:查看指定位置看指定位置的代的代码,如,如“list 1”就是从第一行开始就是从第一行开始列出源代列出源代码。(2)设置断点q在gdb中设置断点命令是“b”(break),后面跟行号或者函数名。q如:(gdb)b 10 341.3 gdb调试器调试器(3)查看断点信息q用命令“info b”(info break)查看断点信息。注意:注意:gdb在一个程序中可以在一个程序中可以设置多个断点,有置多个断点,有多个断点中断多个断点中断时
20、,“Num”处显示断点序号。示断点序号。(4)运行程序:输入“r”(run)开始运行程序。注意:注意:gdb默默认从第一行开始运行,如果要从程序中从第一行开始运行,如果要从程序中指定行开始运行,只需指定行开始运行,只需输入入“r”+行号。行号。(5)查看变量值q程序运行到断点处会自动暂停,输入“p 变量名”351.3 gdb调试器调试器q调试程序时,可能需要修改变量值,程序运行到断点处时,输入“set 变量=设定值”,例如给变量“a2”赋值11,输入“set a2=11”。qgdb在显示变量值时都会在对应值前加“$n”标记,它是当前变量值的引用标记,以后想再引用此变量,可以直接使用“$n”,提
21、高了调试效率。注意:注意:查看看变量量值,不能在程序,不能在程序结束后。束后。361.3 gdb调试器调试器(6)单步运行q在断点处输入“n”(next)或者“s”(step)。它们之间的区别在于:若有函数调用时,“s”会进入该函数而“n”不会进入该函数。(7)继续运行程序q输入“c”(continue)命令恢复程序的正常运行,把剩余的程序执行完,并显示执行结果。(8)退出gdb环境:输入“q”(quit)命令。思考题:此例中,如果比较的结果刚好相反,思考题:此例中,如果比较的结果刚好相反,应该把断点设置在第几行?调试的时候还需要应该把断点设置在第几行?调试的时候还需要注意什么才能看出变量的值?注意什么才能看出变量的值?37思考与实验思考与实验1.编写一个简单的c语言程序:输出两行文字“Linux下的c也不是太难嘛!”,在Linux下编辑、编译、运行。2.编写一个简单的c语言程序:根据输入的两个整数求平均值并且在终端输出,通过gcc编译器得到它的汇编程序文件。3.用gdb调试器调试上面第2题的程序,查看程序执行每一步变量的值,熟悉gdb的使用流程。4.编写一个c语言程序:打印输出所有“水仙花数”,用gdb调试程序(给出步骤,至少十步以上)。所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=1+5+3。38
限制150内