第九章_Linux下的C和C++编程_第1页
第九章_Linux下的C和C++编程_第2页
第九章_Linux下的C和C++编程_第3页
第九章_Linux下的C和C++编程_第4页
第九章_Linux下的C和C++编程_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、第九章第九章 Linux下的下的C和和C+编程编程2/48目录目录引言引言C语言编译器语言编译器GCC程序维护工具程序维护工具make小结小结3/48引言引言Linux软件开发一直在软件开发一直在Internet环境下进行。这个环环境下进行。这个环境是全球性的,编程人员来自世界各地。境是全球性的,编程人员来自世界各地。Linux开发开发工作经常是在工作经常是在Linux用户决定共同完成一个项目时开用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到始的。当开发工作完成后,该软件就被放到Internet站点上,任何用户都可以访问和下载它。由于这个站点上,任何用户都可以访问和下载它。

2、由于这个活跃的开发环境,新的以活跃的开发环境,新的以Linux为基础的软件功能日为基础的软件功能日益强大,且呈爆炸式的增长态势。益强大,且呈爆炸式的增长态势。大多数大多数Linux软件是经过自由软件基金会软件是经过自由软件基金会(Free Software Foundation)提供的提供的GNU(GNU即即GNUs not UNIX)公开认证授权的,因而通常被称作公开认证授权的,因而通常被称作GNU软件。软件。GNU软件免费提供给用户使用,并被证明是软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的非常可靠和高效的。许多流行的Linux实用程序,如实用程序,如C编译器、编译器、s

3、hell和编辑器都是和编辑器都是GNU软件应用程序。软件应用程序。4/48引言引言需要需要 C 语言吗?语言吗?lShell 够用吗?够用吗?脚本语言是一种解释性语言,用户输入只有当执行脚本语言是一种解释性语言,用户输入只有当执行脚本后才被识别和执行。解释性语言在每次执行脚脚本后才被识别和执行。解释性语言在每次执行脚本时必须重新解释,效率低下,也不适合于直接操本时必须重新解释,效率低下,也不适合于直接操作计算机的作计算机的RAM和和I/O设备。设备。lLinux和和C语言关联?语言关联?Shell命令和命令和Linux内核都是用内核都是用C和和C+编写而成的。编写而成的。5/48引言引言l本节

4、学习主要内容:本节学习主要内容:l如何在如何在Linux下安装和使用下安装和使用GUN C的编译器的编译器GCClMake程序维护工具程序维护工具6/489.1 C语言编译器语言编译器GCCGCC 的安装的安装使用使用 GCC 编译器编译器编译程序编译程序函数库函数库调试器调试器7/489.1 C语言编译器语言编译器GCC在在 Linux 开发环境下,最常用的开发环境下,最常用的 C/C+ 语言编译语言编译器器GCC(GNU C Compile)的缩写,它是的缩写,它是GNU/Linux 系统下的标准系统下的标准 C 编译器。编译器。目前,目前,GCC可以支持多种高级语言,如可以支持多种高级语

5、言,如lC/C+lObject ClJAVAlFortranlPASCALlADA等等l还可根据需要选择安装支持的语言。还可根据需要选择安装支持的语言。8/489.1 C语言编译器语言编译器GCCgcc 可以使程序员灵活地控制编译过程。可以使程序员灵活地控制编译过程。编译过程编译过程一般可以分为下面四个阶段,每个阶段分别调用不一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,如下图所示。同的工具进行处理,如下图所示。预预处处理理链链接接编编译译组组译译源程序源程序(*.c)可执行可执行文件文件预处预处理器理器编编译译器器组组译译器器连连接接器器9.1 C语言编译器语言编译器GCCG

6、CC编译分为四个步骤:编译分为四个步骤:l预处理预处理 GCC调用调用cpp程序进行预处理,即分析像程序进行预处理,即分析像#include、#define之类的命令。之类的命令。l编译编译 GCC是调用是调用ccl程序进行编译的,它根据源代码生成汇编语程序进行编译的,它根据源代码生成汇编语言。言。l汇编汇编 GCC调用调用as程序将上一步的结果生成扩展名为程序将上一步的结果生成扩展名为o的目标文件的目标文件l连接连接 GCC调用调用ld程序将目标文件进行连接,最后生成可执行文件。程序将目标文件进行连接,最后生成可执行文件。9/4810/489.1 C语言编译器语言编译器GCCgcc 的版本信

7、息的版本信息 一般来说,系统安装后就已经安装和设定好了一般来说,系统安装后就已经安装和设定好了gcc。在在 shell 的提示符下键入的提示符下键入 gcc -v,屏幕上就会显示出,屏幕上就会显示出目前正在使用的目前正在使用的 gcc 的版本。的版本。11/489.1 C语言编译器语言编译器GCCGCC 的安装的安装lsudo apt-get install build-essential12/489.1 C语言编译器语言编译器GCC9.1.2 使用使用 GCC 编译器编译器l通常后跟一些选项和文件名来使用通常后跟一些选项和文件名来使用 GCC 编译器,编译器,gcc 命令的基本用法如下:命令

8、的基本用法如下:gcc option | filename g+ option | filename l其中其中 option 为为 gcc 使用时的选项,而使用时的选项,而 filename 为为gcc 要处理的文件(课本要处理的文件(课本page.215)C程序:程序:p3.1.c#include #define MIN(A,B) (A)(B)?(B):(A)int main(void)int a;a=MIN(1,2);printf(The result is:%dn,a);return 0;13/4814/4815/4816/48C+程序:程序:p3.2.cxx#include #def

9、ine MIN(A,B) (A)(B)?(B):(A)int main(void)int a;a=MIN(1,2);std:The result is:astd:end;return 0;17/4818/48使用使用GCC控制编译过程控制编译过程预处理:该步骤完成宏和预处理:该步骤完成宏和include的处理。的处理。打开打开p3.1.pre.c文件,可以发现处理在开文件,可以发现处理在开头加入了许多函数声明外,头加入了许多函数声明外,MIN(A,B)宏在代码中也被展开。宏在代码中也被展开。19/48使用使用GCC控制编译过程控制编译过程生成汇编代码:该步骤将预处理生成的代码进行处理,并根据生

10、成汇编代码:该步骤将预处理生成的代码进行处理,并根据编程参数进行优化,最后生成汇编语言。编程参数进行优化,最后生成汇编语言。20/48使用使用GCC控制编译过程控制编译过程生成目标代码:该步骤把中间代码变成特定机器上的指令代码。生成目标代码:该步骤把中间代码变成特定机器上的指令代码。21/48使用使用GCC控制编译过程控制编译过程链接生成可执行代码。链接生成可执行代码。22/4823/489.1 C语言编译器语言编译器GCCl编译编译 main.c 和和 factorial.c 这两个源文件。这两个源文件。/ factorial.c #include int factorial(int n)

11、if (n=1) return 1; else return factorial(n-1)*n; 24/489.1 C语言编译器语言编译器GCC/main.c #include int factorial(int n); int main(int argc,char*argv) int n; if (argc2) printf(Usage:%s nn,argv0); return-1; else n=atoi(argv1); printf(“Factorial of %d is %d.n”,n,factorial(n); return 0; 25/489.1 C语言编译器语言编译器GCC输入下

12、面的命令:输入下面的命令:lgcc o fac main.c factorial.c /编译生成可执编译生成可执行文件行文件facl./fac 6 /执行程序执行程序fac,实参数为,实参数为6lFactorial of 6 is 720 /输出运行结果输出运行结果26/489.1 C语言编译器语言编译器GCC 生成可执行程序的最后一个步骤是链接,也就是将分生成可执行程序的最后一个步骤是链接,也就是将分散的目标文件和库文件组合起来。通常在散的目标文件和库文件组合起来。通常在Linux系统系统上,这些库文件可以在上,这些库文件可以在/lib与与/usr/lib目录中找到。目录中找到。当用户使用的

13、是静态的函数库时,链接器会找到程序当用户使用的是静态的函数库时,链接器会找到程序需要的模组,将它们物理复制到课执行文件中内。共需要的模组,将它们物理复制到课执行文件中内。共享函数库会在执行文件时留下一个记号,指明程序执享函数库会在执行文件时留下一个记号,指明程序执行时,首先必须加载这个函数库。行时,首先必须加载这个函数库。共享函数库使执行文件更小,共享函数库使执行文件更小,Linux默认的行为时链默认的行为时链接共享函数库。接共享函数库。静态函数库(静态函数库(.a),共享函数库(),共享函数库(.so.x.x.x)27/489.1 C语言编译器语言编译器GCC 函数库函数库l用户可用用户可用

14、 “ldd” 命令来查程序需要的共享函数库:命令来查程序需要的共享函数库:上例说明上例说明 p3.1 依赖依赖libC.so.6与与linux-gate.so.l的存在的存在lLinux 缺省的行为是连接共享函数库。缺省的行为是连接共享函数库。28/489.1 C语言编译器语言编译器GCC调试程序调试程序lGCC包含完整的出错检查和警告提示功能,可以包含完整的出错检查和警告提示功能,可以帮助帮助Linux程序员写出更加专业的代码。程序员写出更加专业的代码。l代码:代码:illcode.c程序程序 #include void main(void) long long int var=1; pri

15、ntf(It is not standard C code!n); 29/489.1 C语言编译器语言编译器GCC调试程序调试程序l存在以下问题:存在以下问题:lMain函数的返回值被声明为函数的返回值被声明为void,但实际上应该,但实际上应该是是intl使用了使用了“long long”来声明整数,不符合来声明整数,不符合ANSI/ISO C语言规范语言规范lMain函数在终止前没有调用函数在终止前没有调用return语句语句30/489.1 C语言编译器语言编译器GCC调试程序调试程序l-pedantic参数检查源代码是否符合参数检查源代码是否符合ANSI/ISO C语语言规范言规范l-

16、Wall或或-W参数能够使参数能够使GCC产生尽可能多的警告产生尽可能多的警告信息。信息。31/489.1 C语言编译器语言编译器GCC调试器调试器l在在 Linux 环境下最普及的调试工具是环境下最普及的调试工具是 GDB 和和DDD,此处仅对,此处仅对 GDB 作简单介绍。作简单介绍。l调试器的功能就是能够观察一个程序在执行时的调试器的功能就是能够观察一个程序在执行时的内部活动,或程序出错时发生了什么。内部活动,或程序出错时发生了什么。GNU 的调的调试器称为试器称为 GDB( GNU debuger ),该程序是一个,该程序是一个交互式工具,工作在字符模式,可用于源代码级交互式工具,工作

17、在字符模式,可用于源代码级调试,以及跟踪没有源代码的程序或检查某个终调试,以及跟踪没有源代码的程序或检查某个终止的程序留下的核心文件。止的程序留下的核心文件。32/489.1 C语言编译器语言编译器GCClGDB 主要有以下这些功能:主要有以下这些功能:(1)能跟踪程序中变量的值。)能跟踪程序中变量的值。(2)能够设置断点使程序在指定的代码行上停)能够设置断点使程序在指定的代码行上停下来。下来。(3)能够一行行地执行源代码。)能够一行行地执行源代码。(4)修正某个)修正某个 bug 引起的问题,然后继续查找引起的问题,然后继续查找另一个另一个 bug。33/489.1 C语言编译器语言编译器G

18、CCl一般来说一般来说 GDB 主要调试的是主要调试的是 C/C+ 的程序。要的程序。要调试调试 C/C+ 的程序,首先在编译时,必须把调试的程序,首先在编译时,必须把调试信息加到可执行文件中。使用编译器信息加到可执行文件中。使用编译器(gcc/g+)的的 -g 参数参数可以做到这一点。如:可以做到这一点。如: gcc -g test.c -o test g+ -g test.cpp -o test 如果没有如果没有 -g,在调试时将见不到程序的函数名、,在调试时将见不到程序的函数名、变量名,所代替的全是运行时的内存地址。变量名,所代替的全是运行时的内存地址。l启动启动 GDB 的方法是从命令

19、行键入的方法是从命令行键入 “gdb filename”,按回车键就可以运行按回车键就可以运行 GDB 来调试可执行文件。来调试可执行文件。34/489.1 C语言编译器语言编译器GCCl基本基本 GDB 命令命令 :file 装入想要调试的可执行文件装入想要调试的可执行文件kill 终止正在调试的程序终止正在调试的程序list 列出产生执行文件的源代码的一部分列出产生执行文件的源代码的一部分next 执行一行源代码但不进入函数内部执行一行源代码但不进入函数内部step 执行一行源代码而且进入函数内部执行一行源代码而且进入函数内部run 执行当前被调试的程序执行当前被调试的程序quit 终止终

20、止 gdbwatch 监视一个变量的值而不管它何时被改变监视一个变量的值而不管它何时被改变break 在代码里设置断点在代码里设置断点, 这将使程序执行到这里时被这将使程序执行到这里时被挂起挂起shell 不离开不离开 gdb 就执行就执行 UNIX shell 命令命令35/489.1 C语言编译器语言编译器GCCGDB使用举例使用举例l源代码如下源代码如下编译:gcc o bug bug.c36/489.1 C语言编译器语言编译器GCCl编译并运行编译并运行编译编译?37/489.1 C语言编译器语言编译器GCCl使用使用gdb调试调试bug输入字符串输入字符串运行运行bug出错位置出错位

21、置能不能看到源代码呢?能不能看到源代码呢?38/489.1 C语言编译器语言编译器GCCl使用使用gcc的的-g参数参数gcc g o bug bug.c重新调试重新调试源代码源代码39/489.1 C语言编译器语言编译器GCC40/489.2 程序维护工具程序维护工具make引言引言l随着软件复杂度的提高,人们提出了模块化的概随着软件复杂度的提高,人们提出了模块化的概念,即将复杂的软件分解为很多细小的功能模块,念,即将复杂的软件分解为很多细小的功能模块,于是,软件代码按功能模块分散到各个不同的文于是,软件代码按功能模块分散到各个不同的文件。件。l这使得编译这些文件成为问题,有时候只是改动这使

22、得编译这些文件成为问题,有时候只是改动某个文件就不得不重新编译整个工程。对于大型某个文件就不得不重新编译整个工程。对于大型项目而言,重新编译所有代码往往需要很长时间。项目而言,重新编译所有代码往往需要很长时间。l使用使用make对源代码进行管理后,将只编译改动的对源代码进行管理后,将只编译改动的代码文件,而不用完全编译。代码文件,而不用完全编译。41/489.2 程序维护工具程序维护工具makemake工具工具lMake通过读入配置好的文本文件,并根据通过读入配置好的文本文件,并根据文本文件中预先定义的规则和步骤,完成文本文件中预先定义的规则和步骤,完成代码的编译和链接工作,最终生成所需要代码

23、的编译和链接工作,最终生成所需要的项目文件。这个文本文件在缺失情况下的项目文件。这个文本文件在缺失情况下为为makefile或或Makefile。lMake在对项目文件进行编译时,在对项目文件进行编译时, 会判断会判断文件的修改和生成时间。如果某源代码文文件的修改和生成时间。如果某源代码文件在上次编译后再次被修改,则件在上次编译后再次被修改,则make将只将只编译该文件,而不会对整个重新编译编译该文件,而不会对整个重新编译。42/489.2 程序维护工具程序维护工具makeMakefile示例示例 p3.1.c程序为例,使用程序为例,使用vi编写编写makefile文件,文件,内容如下:内容如

24、下: p3.1:p3.1.c tab键键gcc o p3.1 p3.1.c9.2 程序维护工具程序维护工具make43/4844/489.2 程序维护工具程序维护工具make基本原理和用法基本原理和用法l1. 依赖关系描述依赖关系描述一般的语法规则为:一般的语法规则为:target(目标名):(目标名):dependenCy(依赖模块)(依赖模块)command(命令行)(命令行)l2. make 语法规则语法规则make命令的一般语法规则是:命令的一般语法规则是:make-f make文件名文件名目标名目标名 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 #inc

温馨提示

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

评论

0/150

提交评论