版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章Linux下的C和C++编程2/48目录引言C语言编译器GCC程序维护工具make小结3/48引言Linux软件开发一直在Internet环境下进行。这个环境是全球性的,编程人员来自世界各地。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到Internet站点上,任何用户都可以访问和下载它。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,且呈爆炸式的增长态势。大多数Linux软件是经过自由软件基金会(FreeSoftwareFoundation)提供的GNU(GNU即GNU’snotUNIX)公开认证授权的,因而通常被称作GNU软件。GNU软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的Linux实用程序,如C编译器、shell和编辑器都是GNU软件应用程序。4/48引言需要C语言吗?Shell够用吗?脚本语言是一种解释性语言,用户输入只有当执行脚本后才被识别和执行。解释性语言在每次执行脚本时必须重新解释,效率低下,也不适合于直接操作计算机的RAM和I/O设备。Linux和C语言关联?Shell命令和Linux内核都是用C和C++编写而成的。5/48引言本节学习主要内容:如何在Linux下安装和使用GUNC的编译器GCCMake程序维护工具6/489.1C语言编译器GCCGCC的安装使用GCC
编译器编译程序函数库调试器7/489.1C语言编译器GCC在Linux开发环境下,最常用的C/C++语言编译器GCC(GNUCCompile)的缩写,它是GNU/Linux系统下的标准C编译器。目前,GCC可以支持多种高级语言,如C/C++ObjectCJAVAFortranPASCALADA等还可根据需要选择安装支持的语言。8/489.1C语言编译器GCCgcc可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,如下图所示。预处理链接编译组译源程序(*.c)可执行文件预处理器编译器组译器连接器9.1C语言编译器GCCGCC编译分为四个步骤:预处理
GCC调用cpp程序进行预处理,即分析像#include、#define之类的命令。编译GCC是调用ccl程序进行编译的,它根据源代码生成汇编语言。汇编GCC调用as程序将上一步的结果生成扩展名为o的目标文件连接
GCC调用ld程序将目标文件进行连接,最后生成可执行文件。9/4810/489.1C语言编译器GCCgcc的版本信息一般来说,系统安装后就已经安装和设定好了gcc。在shell的提示符下键入gcc-v,屏幕上就会显示出目前正在使用的gcc的版本。11/489.1C语言编译器GCCGCC的安装sudoapt-getinstallbuild-essential12/489.1C语言编译器GCC9.1.2使用GCC
编译器通常后跟一些选项和文件名来使用GCC
编译器,gcc命令的基本用法如下:gcc[option|filename]g++[option|filename]其中option为gcc使用时的选项,而filename为gcc要处理的文件(课本page.215)C程序:p3.1.c#include<stdio.h>#defineMIN(A,B)((A)>(B)?(B):(A))intmain(void){inta;a=MIN(1,2);printf("Theresultis:%d\n",a);return0;}13/4814/4815/4816/48C++程序:p3.2.cxx#include<iostream>#defineMIN(A,B)((A)>(B)?(B):(A))intmain(void){inta;a=MIN(1,2);std::<<"Theresultis:"<<a<<std::end;return0;}17/4818/48使用GCC控制编译过程预处理:该步骤完成宏和include的处理。打开p3.1.pre.c文件,可以发现处理在开头加入了许多函数声明外,MIN(A,B)宏在代码中也被展开。19/48使用GCC控制编译过程生成汇编代码:该步骤将预处理生成的代码进行处理,并根据编程参数进行优化,最后生成汇编语言。20/48使用GCC控制编译过程生成目标代码:该步骤把中间代码变成特定机器上的指令代码。21/48使用GCC控制编译过程链接生成可执行代码。22/4823/489.1C语言编译器GCC编译main.c
和factorial.c
这两个源文件。//factorial.c#include<stdio.h>intfactorial(intn){if(n<=1)return1;elsereturnfactorial(n-1)*n;}24/489.1C语言编译器GCC//main.c#include<stdio.h>intfactorial(intn);intmain(intargc,char*argv[]){intn;if(argc<2){printf("Usage:%sn\n",argv[0]);return-1;}else{n=atoi(argv[1]);printf(“Factorialof%dis%d.\n”,n,factorial(n));}return0;}25/489.1C语言编译器GCC输入下面的命令:gcc–ofacmain.cfactorial.c//编译生成可执行文件fac./fac6//执行程序fac,实参数为6Factorialof6is720//输出运行结果26/489.1C语言编译器GCC
生成可执行程序的最后一个步骤是链接,也就是将分散的目标文件和库文件组合起来。通常在Linux系统上,这些库文件可以在/lib与/usr/lib目录中找到。当用户使用的是静态的函数库时,链接器会找到程序需要的模组,将它们物理复制到课执行文件中内。共享函数库会在执行文件时留下一个记号,指明程序执行时,首先必须加载这个函数库。共享函数库使执行文件更小,Linux默认的行为时链接共享函数库。静态函数库(.a),共享函数库(.so.x.x.x)27/489.1C语言编译器GCC
函数库用户可用“ldd”命令来查程序需要的共享函数库:上例说明p3.1依赖libC.so.6与linux-gate.so.l的存在Linux缺省的行为是连接共享函数库。28/489.1C语言编译器GCC调试程序GCC包含完整的出错检查和警告提示功能,可以帮助Linux程序员写出更加专业的代码。代码:illcode.c程序
#include<stdio.h>voidmain(void){longlongintvar=1;printf("ItisnotstandardCcode!\n");}29/489.1C语言编译器GCC调试程序存在以下问题:Main函数的返回值被声明为void,但实际上应该是int使用了“longlong”来声明整数,不符合ANSI/ISOC语言规范Main函数在终止前没有调用return语句30/489.1C语言编译器GCC调试程序-pedantic参数检查源代码是否符合ANSI/ISOC语言规范-Wall或-W参数能够使GCC产生尽可能多的警告信息。31/489.1C语言编译器GCC调试器在Linux环境下最普及的调试工具是GDB和DDD,此处仅对GDB作简单介绍。调试器的功能就是能够观察一个程序在执行时的内部活动,或程序出错时发生了什么。GNU的调试器称为GDB(GNUdebuger),该程序是一个交互式工具,工作在字符模式,可用于源代码级调试,以及跟踪没有源代码的程序或检查某个终止的程序留下的核心文件。32/489.1C语言编译器GCCGDB
主要有以下这些功能:(1)能跟踪程序中变量的值。(2)能够设置断点使程序在指定的代码行上停下来。(3)能够一行行地执行源代码。(4)修正某个bug引起的问题,然后继续查找另一个bug。33/489.1C语言编译器GCC一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须把调试信息加到可执行文件中。使用编译器(gcc/g++)的-g参数可以做到这一点。如:gcc-gtest.c-otestg++-gtest.cpp-otest如果没有-g,在调试时将见不到程序的函数名、变量名,所代替的全是运行时的内存地址。启动GDB的方法是从命令行键入“gdbfilename”,按回车键就可以运行GDB来调试可执行文件。34/489.1C语言编译器GCC基本GDB
命令:file
装入想要调试的可执行文件kill终止正在调试的程序list列出产生执行文件的源代码的一部分next执行一行源代码但不进入函数内部step执行一行源代码而且进入函数内部run执行当前被调试的程序quit终止gdbwatch监视一个变量的值而不管它何时被改变break在代码里设置断点,这将使程序执行到这里时被挂起shell不离开gdb
就执行UNIX
shell
命令35/489.1C语言编译器GCCGDB使用举例源代码如下编译:gcc–obugbug.c36/489.1C语言编译器GCC编译并运行编译????37/489.1C语言编译器GCC使用gdb调试bug输入字符串运行bug出错位置能不能看到源代码呢?38/489.1C语言编译器GCC使用gcc的-g参数gcc–g–obugbug.c重新调试源代码39/489.1C语言编译器GCC40/489.2程序维护工具make引言随着软件复杂度的提高,人们提出了模块化的概念,即将复杂的软件分解为很多细小的功能模块,于是,软件代码按功能模块分散到各个不同的文件。这使得编译这些文件成为问题,有时候只是改动某个文件就不得不重新编译整个工程。对于大型项目而言,重新编译所有代码往往需要很长时间。使用make对源代码进行管理后,将只编译改动的代码文件,而不用完全编译。41/489.2程序维护工具makemake工具Make通过读入配置好的文本文件,并根据文本文件中预先定义的规则和步骤,完成代码的编译和链接工作,最终生成所需要的项目文件。这个文本文件在缺失情况下为makefile或Makefile。Make在对项目文件进行编译时,会判断文件的修改和生成时间。如果某源代码文件在上次编译后再次被修改,则make将只编译该文件,而不会对整个重新编译。42/489.2程序维护工具makeMakefile示例p3.1.c程序为例,使用vi编写makefile文件,内容如下:p3.1:p3.1.c
[tab键]gcc–op3.1p3.1.c9.2程序维护工具make43/4844/489.2程序维护工具make基本原理和用法1.依赖关系描述一般的语法规则为:target(目标名):dependenCy(依赖模块)command(命令行)2.make语法规则make命令的一般语法规则是:make[-fmake文件名][目标名]
45/489.2程序维护工具make例子:p3.3.c中用到p3.3.part1.c和p3.3.part2.c中定义的函数。如果要编译p3.3.c必须先对p3.3.part1.c和p3.3.part2.c进行编译。p3.3.part1.c#include<stdio.h>voidpart_one(){printf(“inthepartonefunction!\n”);}46/489.2程序维护工具makep3.3.part2.c#include<stdio.h>voidpart_two(){printf(“intheparttwofunction!\n”);}p3.3.c#incl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东科学技术职业学院《数据新闻理论与实践》2023-2024学年第一学期期末试卷
- 广东酒店管理职业技术学院《英语三》2023-2024学年第一学期期末试卷
- 广东金融学院《金融建模与量化分析》2023-2024学年第一学期期末试卷
- 广东金融学院《中文信息处理技术》2023-2024学年第一学期期末试卷
- 广东环境保护工程职业学院《西方舞蹈史》2023-2024学年第一学期期末试卷
- 广东东软学院《酒店客户管理实验》2023-2024学年第一学期期末试卷
- 广东创新科技职业学院《故事医学》2023-2024学年第一学期期末试卷
- 《建筑材料管理》课件
- 小学生课件插花图片
- 赣南医学院《即兴弹唱》2023-2024学年第一学期期末试卷
- 物流运筹学附录习题答案
- 发明专利专利答辩模板
- 市政府副市长年道路春运工作会议讲话稿
- 铸铁镶铜闸门
- GB_T 37514-2019 动植物油脂 矿物油的检测(高清版)
- 闸门水力计算说明
- 大型塔器“立装成段整体就位”工法
- 联想集团内训师管理制度
- 常用函数图像(1)
- 静脉血栓栓塞预防和治疗的专家共识
- 《锅炉及锅炉房设备》课程设计北京市某燃煤厂区蒸汽锅炉房设计
评论
0/150
提交评论