版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 Linux平台上的软件开发,本章概要 程序开发过程 代码生成工具 多模块软件的编译和链接 源代码调试 库的开发、调试和使用 RCS和CVS的版本控制,2020年7月18日星期六,2,.1 程序开发过程,.1.1 计算机编程语言概述,.1.2 C、C+和Java程序的编译,.1.3 Linux下C编程常识,2020年7月18日星期六,3,通常的Linux/UNIX系统都会支持几种解释型和编译型的高级编程语言。包括C、C+、JAVA、Perl、LISP和FORTRAN。 多数的Linux/UNIX平台下的应用软件是用C语言写的,Linux/UNIX操作系统也是用C写的 。该平台下C语言开发
2、工具比较多。,4.1.1 计算机编程语言概述,2020年7月18日星期六,4,编程语言和编程范式,编程语言 命令型 使用变量,赋值语句,迭代重复等; C、C+、Java、Basic、COBOL、FORTRAN等。 函数/应用型 没有变量、赋值语句,迭代的概念; 运算是将参数传递到函数中完成; LISP、ML、Haskell、Scheme等。,2020年7月18日星期六,5,编程语言和编程范式,逻辑型 通过指定规则,并让语言执行这些规则而完成运算; 最流行的逻辑编程语言是Prolog。 面向对象型 提供对抽象数据类型的支持,即类。 运算是通过对类进行实例化(即产生对象)和对象间的通信产生方法调用
3、来实现。 Smalltalk80、Eiffel、Java、C+等。,2020年7月18日星期六,6,编程范式,面向过程 面向对象,2020年7月18日星期六,7,编译过程,图 高级语言转换为可执行代码的过程,高级语言源代码,编译程序,汇编代码,汇编程序,目标代码,链接程序,可执行代码,其他目标模块,库模块,2020年7月18日星期六,8,解释过程,高级语言源代码,解释程序,2020年7月18日星期六,9,4.1.2 C、C+程序的编译,C和C+程序转换为可执行代码的过程,C/C+语言源代码,C/C+ 编译程序,汇编代码,汇编程序,目标代码,链接程序,可执行代码,其他目标模块,库模块,预处理 程
4、序,2020年7月18日星期六,10,预处理程序的工作,插入用#include指令指定的文件; 扩展宏(由#define指令所指定); 处理用#if指令指定的条件编译; 处理连续行连接(只限C)。,2020年7月18日星期六,11,4.1.3 Linux下C编程常识,标准 函数库和系统调用 C语言编程风格 库和头文件的保存位置,2020年7月18日星期六,12,1. 标准,ANSI C:是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。 后来被ISO(国际标准化组织)接受为标准,因此也称为 ISO C。 ANSI C 不仅定义了 C 编程语言的语法和语义,而且还定义了一个标准
5、库。,2020年7月18日星期六,13,标准库,这个库可以根据头文件划分为 15 个部分,其中包括: 字符类型 () 错误码 () 浮点常数 () 数学常数 () 标准定义 () 标准 I/O () 工具函数 (),字符串操作 () 时间和日期 () 可变参数表 () 信号 () 非局部跳转 () 本地信息 () 程序断言 () 等等。,2020年7月18日星期六,14,POSIX:该标准最初由 IEEE 开发的标准族,部分已经被 ISO 接受为国际标准。该标准的具体内容 见 1.1.3。POSIX.1 和 POSIX.2 分别定义了 POSIX 兼容操作系统的 C 语言系统接口 以及 she
6、ll 和工具标准。这两个标准是通常提到的标准。 SVID:System V 的接口描述。System V 接口描述(SVID)是描述 ATT Unix System V 操作 系统的文档,是对 POSIX 标准的扩展超集。 XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版), 是比 POSIX 更为一般的标准。X/Open 拥有 Unix 的版权,而 XPG 则指定成为 Unix 操作系统必须满足的要求。,2020年7月18日星期六,15,2函数库和系统调用,1)glibc GNU 的 C 函数库,即 glibc,是 Linux
7、上最重要的函数库,它定义了 ISO C 标准指定的所有的库函数,以及由 POSIX 或其他 UNIX 操作系统统变种指定的附加特色,还包括有与 GNU 系统相关的扩展。目前,流行的 Linux 系统使用 glibc 2.0 以上的版本。 2)其他重要函数库 GNU Libtool 、CrackLib 、LibGTop 、 libungif、libtiff、libpng、Imlib 等,2020年7月18日星期六,16,3)系统调用 系统调用是操作系统提供给外部程序的接口。 在 C 语言中,操作系统的系统调用通常通过函数调用的形式完成,这是因为这些函数封装了系统调用的细节,将系统调用的入口、参数
8、以及返回值用 C 语言的函数调用过程实现。 在 Linux 系统中,系统调用函数定义在 glibc 中。,2020年7月18日星期六,17,3 C 语言编程风格K else return factorial (n - 1) * n; ,2020年7月18日星期六,40,/清单 main.c #include #include int factorial (int n); int main (int argc, char *argv) int n; if (argc 2) printf (Usage: %s nn, argv 0); return -1; else n = atoi (argv1
9、); printf (Factorial of %d is %d.n, n, factorial (n); return 0; ,2020年7月18日星期六,41,利用如下的命令可编译生成可执行文件,并执行程序: $ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.,2020年7月18日星期六,42,GCC 可同时用来编译 C 程序和 C+ 程序。 一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C+ 程序。 在 Linux 中,C 源文件的后缀名为 .c,而 C+ 源文件的后缀名
10、为 .C 或 .cc 或.cxx。 但是,gcc 命令只能编译 C+ 源文件,而不能自动和 C+ 程序使用的库连接。因此,通常使用 g+ 命令来完完成 C+ 程序的编译和连接,该程序会自动调用 gcc 实现编译。,gcc与g+,2020年7月18日星期六,43,g+命令,假设我们有一个如下的 C+ 源文件(hello.C): #include void main (void) cout Hello, world! endl; 则可以如下调用 g+ 命令编译、连接并生成可执行文件: $ g+ -o hello hello.C $ ./hello Hello, world!,2020年7月18日星
11、期六,44,4.3 多模块软件的编译和链接,2020年7月18日星期六,45,1 Makefile 的作用原理,假设我们有下面这样的一个程序,该程序由三个模块main.c 、mytool1.c和 mytool2.c组成。 在Linux中,我们可以使用下面的命令来编译整个程序: gcc -Wall -o myprogram main.c mytool1.c mytool2.c,2020年7月18日星期六,46,/* main.c */ #include mytool1.h #include mytool2.h int main(int argc,char *argv) mytool1_print
12、(hello); mytool2_print(hello); /* mytool1.h */ #ifndef _MYTOOL_1_H #define _MYTOOL_1_H void mytool1_print(char *print_str); #endif,2020年7月18日星期六,47,/* mytool1.c */ #include mytool1.h void mytool1_print(char *print_str) printf(This is mytool1 print %s ,print_str); /* mytool2.h */ #ifndef _MYTOOL_2_H
13、#define _MYTOOL_2_H void mytool2_print(char *print_str); #endif /* mytool2.c */ #include mytool2.h void mytool2_print(char *print_str) printf(This is mytool2 print %s ,print_str); ,2020年7月18日星期六,48,编译,由于这个程序很短,我们也可以这样来编译: gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c gcc -o main main.o mytool1.o m
14、ytool2.o 如果在mytool1.c文件中改变了一些代码,不需要重新编译main.c 和mytool2.c,只需要重新编译mytool1.c ,并且重新链接: gcc -wall -c mytool1.o mytool1.c gcc -o myprogram main.o mytool1.o mytool2.o,2020年7月18日星期六,49,复杂的情况,但是当事情更复杂一点,如果程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译? 为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make。 只要执行一下make,就可以把上面的问题解决掉。 在执行make之前,要
15、先编写一个非常重要的文件Makefile。,2020年7月18日星期六,50,在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会非常不方便。因此,人们通常利用 make 工具来自动完成编译工作。 这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。 利用这种自动编译可大大简化开发工作,避免不必要的重新编译。,使用GNU Make,2020年7月18日星期六,51,make,make是一个命令工具,是一个解释makefile中指令的命令工具。 一般来说,大多数的IDE都有这个
16、命令,比如:Delphi的make,Visual C+的nmake,Linux下GNU的make。,2020年7月18日星期六,52,Linux提供了make命令和makefile文件的方式来维护目标程序。 Make命令会按照makefile文件中描述的模块依赖关系,根据模块的修改情况重新编译链接目标代码,实现维护工作的自动化。,2020年7月18日星期六,53,makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。 当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。,2020年7月
17、18日星期六,54,makefile 文件是许多编译器,包括 Windows NT 下的编译器维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。 默认情况下,GNU make 工具在当前工作目录中按如下顺序搜索 makefile: GNUmakefile makefile Makefile,make命令找到了就解释这个文件. 在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的 “ma
18、kefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。,2020年7月18日星期六,55,程序编译的一些规范和方法,一般来说,无论是C、C+、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。,2020年7月18日星期六,56,编译,编译器需要的是语法的正确,函数与变量的声明的正确。 对于后者,通常是需要告诉编译器头文件
19、的所在位置(头文件中应该只是声明,而定义应该放在C/C+文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。 一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。,2020年7月18日星期六,57,链接,主要是链接函数和全局变量。可以使用这些中间目标文件(O文件或是OBJ文件)来链接应用程序。 链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,要给中间目标文件打个包。 在Windows下这种包叫“库文件”(Li
20、brary File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。,2020年7月18日星期六,58,小结,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。 在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。 在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object Fi
21、le.,2020年7月18日星期六,59,简单的makefile文件,这是上面那个程序的Makefile文件: main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.h gcc -c main.c mytool1.o:mytool1.c mytool1.h gcc -c mytool1.c mytool2.o:mytool2.c mytool2.h gcc -c mytool2.c,有了这个Makefile文件,不论什么时候修改了源程序当中的什
22、么文件,只要执行make命令,编译器都只会去编译和修改文件有关的文件,其它的文件它连理都不去理。,2020年7月18日星期六,60,在Makefile中以#开始的行都是注释行; Makefile中最重要的是描述文件的依赖关系的说明。一般的格式是: target:components TAB rule 第一行表示的是依赖关系。第二行是规则。 比如说上面的那个Makefile文件的第二行。 main:main.o mytool1.o mytool2.o 表示目标(target)main的依赖对象(components)是main.o mytool1.omytool2.o 当依赖的对象在目标修改后修
23、改的话,就要去执行规则一行所指定的命令。就象上面那个Makefile第三行所说的一样要执行 gcc-o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键,make并不管命令是怎么工作的,只管执行所定义的命令。make会比较target文件和components文件的修改日期,如果components文件的日期要比target文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。,2020年7月18日星期六,61,三个变量,Makefile有三个非常有用的变量。分别是$,$,$。它们代表的意义分别是: $ 目
24、标文件 $ 所有的依赖文件 $ 依赖列表中的第 一个依赖文件 如果使用上面三个变量,那么可以简化Makefile文件为:,2020年7月18日星期六,62,简化后的Makefile,main:main.o mytool1.o mytool2.o gcc -o $ $ main.o:main.c mytool1.h mytool2.h gcc -c $ mytool1.o:mytool1.c mytool1.h gcc -c $ mytool2.o:mytool2.c mytool2.h gcc -c $,$ 目标文件 $ 所有的依赖文件 $ 依赖列表中的第 一个依赖文件,2020年7月18日星
25、期六,63,Makefile的缺省规则,.c.o: gcc -c $ 这个规则表示所有的 .o文件都是依赖于相应的.c文件的。例如mytool.o依赖于mytool.c,这样Makefile还可以变为:,$ 目标文件 $ 所有的依赖文件 $ 依赖列表中的第 一个依赖文件,2020年7月18日星期六,64,再一次简化后的Makefile,main:main.o mytool1.o mytool2.o gcc -o $ $ .c.o: gcc -c $,$ 目标文件 $ 所有的依赖文件 $ 依赖列表中的第 一个依赖文件,2020年7月18日星期六,65,2 makefile文件的基本语句,make
26、file文件有如下五种基本语句。 注释语句(Comments) 注释语句是不会真正执行的,它只起注释语句的作用。它的作用范围是从“#”开始,到该行结束为止。 宏(Macros) 一般按如下方式定义宏: NAME=data 在它后面语句中,若出现(NAME),则都被data替代, 如: SRC =main.mgcc (SRC)被解释为main.mgcc。,2020年7月18日星期六,66,默认的宏,AR=ar GET=get MAS=mas AS=as FC=f77 CC=cc LD=ld LEX=lex SHELL=/bin/sh MAKEFLAGS=b 用命令make p可以列出所有默认的宏
27、定义。,2020年7月18日星期六,67,特殊的宏,在Linux中,有几个特殊的宏定义: :扩展成依靠列表中的第一个依靠文件; :代表目标文件名,即写入输出的文件名; * :代表不包含后缀字符串的输入文件名; ? :代表比目标文件更晚的依赖文件名; % :比库文件更晚的库成员文件。 $ :所有的依赖文件,2020年7月18日星期六,68,显式规则(Explicit Rules),显式规则具体列出了目标文件的依赖文件以及作用于其上的命令。 其基本格式如下: 目标文件:依赖文件命令 (注意,每个命令前使用Tab键缩进一次) 例: main:main.m list.h gcc o main.m list.h,2020年7月18日星期六,69,隐含规则(Implicit Rule
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CRIA 17003.2-2024功能鞋 第2部分:防寒评价技术规范
- T/TMAC 163-2025新能源汽车电子后视镜技术要求
- T/GDAF 005-2022广东公共安全技术防范标准化试点管理规范
- T/CI 344-2024低温冷风微量润滑平面磨削加工工艺规范
- T/CAAMTB 94-2022汽车车窗玻璃用加速固化聚氨酯胶粘剂
- T/CPMIA 0107-2026注射成型车间智能制造执行系统 (MES)
- AI在体育教育中的应用
- 2025~2026学年安徽宣城市郎溪县人教版六年级下册期末数学试卷【附答案】
- 2025-2026学年吉林省舒兰市初中数学九年级期末下册自测模拟重点试题(附答案)
- PHP微信开发面试题及详细答案(实战版)
- 2026年重庆丰都县社区工作者招聘考试【结构化面试题库+高分答题模板】(含考官评分要点)
- 统编版九年级上册 道德与法治 第二单元《进入新时代》单元检测试卷(含答案)
- 2026新教材语文 7 培养德智体美劳全面发展的社会主义建设者和接班人 课件
- 2026江西九江长途汽车运输集团有限公司劳动合同制员工招聘4人考试模拟试题及答案解析
- 冷库工程监理实施细则
- 变压器装配工岗中理论实操考核试卷含答案
- 2026国家能源集团榆林化工煤制油重大项目筹建处招聘岗位(74人)笔试历年难易错考点试卷带答案解析
- 2026年国家能源投资集团有限责任公司校园招聘考试题库及答案解析
- 2026年三星 (中国) 半导体有限公司招聘(西安有岗)笔试备考题库及答案详解
- DB37T5324-2025房屋建筑工程施工安全监督技术规程
- XX光伏电站电力网络信息系统安全事故应急预案
评论
0/150
提交评论