版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 Unix系统编程基础理解:程序设计环境(用户空间和系统空间)理解:基于操作系统的程序设计(系统调用)掌握: C/C+编辑器 GCC掌握: GNU make和makefile的编写规则掌握 :C/C+调试器 GDB了解:常用系统调用及库函数的使用方法了解:常用函数库glib的使用了解:程序管理软件SCCSCVS第1页,共49页。6.1 程序设计环境理想的程序设计环境单任务环境-单用户、单进程多任务环境下的程序设计用户程序不能直接控制系统的硬件设备用户程序通过操作系统来控制系统的资源存储中存在:用户程序空间和系统空间程序程序程序系统核心空间(内核)第2页,共49页。6.2 基于操作系统支持
2、的程序设计建立系统编程的思想站在资源管理者的角度来分析问题,充分考虑系统为用户程序提供哪些服务和资源,以实现对系统资源的有效利用嵌入式系统系统调用用户程序通过系统调用实现对系统内核功能的使用及对各种硬件资源的访问了解:系统调用的使用方法输入、输出控制类进程、线程管理类:创建、终止、同步、互斥等内存及辅存管理类第3页,共49页。6.2 基于操作系统支持的程序设计设备控制类本地进程通信管理类网络进程通信管理类系统调用与库函数的关系系统调用是操作系统层面提供的服务,库函数是高级语言提供的服务用户程序库函数用户程序系统调用第4页,共49页。6.3 在UNIX中完成C程序开发编程语言低级语言机器语言:
3、能够由机器直接执行。汇编语言: 包含一些助记符,需要由汇编程序将其翻译成机器语言。高级语言:需要由编译程序和解释语言将其翻译成机器语言COBOL、BASIC、C/C+、PASCAL、FORTRAN、JAVA第5页,共49页。6.3 在UNIX中完成C程序开发建立可执行程序的步骤建立源文件建立目标文件建立可执行文件源代码目标代码:由编译程序和解释程序把源代码翻译成机器能够理解的语言。目标代码不是可执行文件,它还缺少库文件。可执行代码可能包含其它程序代码,由链接程序将目标代码和其它程序代码链接在一起,形成完整的可执行程序库文件指的是为用户程序和操作系统之间提供接口的程序第6页,共49页。6.3 在
4、UNIX中完成C程序开发区别编译程序和解释程序编译程序:把高级语言翻译成机器语言。它一次编译所有的程序代码,在编译完成之前没有任何结果反馈;解释程序:把高级语言翻译成机器语言。它一次翻译一行代码,并立即将执行结果反馈。 编译程序产生更好且效率更高的目标代码; 解释程序在每次执行时都会重新解释源代码,效率较低Linux中的C/C+编译程序是GCCLinux中的SHELL解释程序是BASH第7页,共49页。6.3.1 GCC:C/C+ 编译器GCC(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,gcc编译器能将C、C+语言源程序、汇编语言和目标程序编译、链接成可执行
5、文件,以下是gcc支持编译的一些源文件的后缀及其解释(点击)使用gcc将C源代码文件生成可执行文件,需要经历4个相关的步骤:预处理,编译,汇编,链接预处理链接编译组译源程序(*.c)可执行文件预处理器编译器组译器链接器第8页,共49页。gcc支持编译的源文件后缀第9页,共49页。GCC的使用方法gcc的基本用法:gcc 选项 文件名列表gcc的选项说明:-c只编译并生成目标文件(.o)-g生成调试信息-o file指定生成的文件名这里的文件名列表指的是需要编译和链接的文件,例如C, C+源文件,目标文件,汇编程序代码等。gcc的选项非常多,可以使用man gcc来查看,我们经常使用的选项是 -
6、c -g -o第10页,共49页。gcc命令的常用选项第11页,共49页。几个简单的C程序实例hello.cgcc -o hello hello.c./hello计算阶乘的程序将多个源程序编译成一个可执行文件gcc -o factorial factorial_main.c factorial.c./ factorial n编译一个C+程序GCC编译器可通过后缀名判断c(.c)或c+程序(.C/.cpp),使用g+进行编译g+ -o hello_C hello.cpp第12页,共49页。改正错误及重定向标准错误如果源程序有误,希望将错误信息重定向到某个文件,以便于逐一纠错,可使用如下语句gcc
7、 hello_error.c -o hello_error 2error重定向标准错误1 file: 标准输出设备的重定向2 file: 标准错误输出的重定向rootstu1 no10# cat errorhello_error.c: In function main:hello_error.c:9: syntax error before printf第13页,共49页。6.3.2 GNU make和makefile文件GNU make makefile 基本结构 makefile 变量 GNU make 的主要预定义变量 隐含规则 makefile 范例 运行 make第14页,共49页。
8、GNU make利用 make 工具来自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。make 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并链接生成可执行文件,并定义了源文件之间的依赖关系。 当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。第15页,共49页。GNU make默认情况下,GNU make
9、 工具在当前工作目录中按如下顺序搜索 makefileGNU makefilemakefileMakefile在 UNIX 系统中,习惯使用 Makefile作为 makefile文件。如果要使用其他文件作为 makefile,则可利用类似下面的 make 命令选项指定 makefile 文件: make -f Makefile.debug第16页,共49页。makefile的基本结构makefile 中一般包含如下内容:需要由 make工具创建的项目,通常是目标文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目。要创建的项目依赖于哪些文件;创建每个项目时需要运行的命令;
10、例子:假设你现在有一个 C+ 源文件 test.C,该源文件包含有自定义的头文件 test.h,则目标文件 test.o 明确依赖于两个源文件:test.C 和 test.h。另外你可能只希望利用 g+ 命令来生成 test.o 目标文件。 这时就可以利用如下的 makefile 来定义 test.o 的创建规则 第17页,共49页。Makefile基本结构实例1演示:例1当 test.C 或 test.h 文件在编译之后又被修改,则 make 工具可自动重新编译 test.o,如果在前后两次编译之间,test.C 和 test.h 均没有被修改,而且 test.o 还存在的话,就没有必要重新
11、编译。test.o: test.C test.h g+ -c -g test.C指定 test.o 为目标依赖文件指定了如何从目标所依赖的文件建立目标第18页,共49页。Makefile基本结构一个 makefile 文件中可定义多个目标,利用 make target 命令可指定要编译的目标,如果不指定目标, 则使用第一个目标。通常,makefile 中定义有 clean 目标,可用来清除编译过程中的中间文件,例如: clean: rm -f *.o 运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产生的所有中间文件。第19页,共49页。makefile
12、 实例2 Network: Subrs.o network.o gcc -o Network Subrs.o network.oSubrs.o: Subrs.c Netdefs.h gcc -c Setwork.o: network.c Netdefs.h gcc -c network.cclean: rm -f *.o演示:例2第20页,共49页。Makefile变量GNU 的 make 工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系以及建立目标的命令的特色。其中之一就是变量或宏的定义能力。如果你要以相同的编译选项同时编译十几个 C 源文件,而为每个目 标的编译指定冗长的编译
13、选项的话,将是非常乏味的。但利用简单的变量定义,可避免这种乏味的工作# Define macros for name of compiler CC = gcc # Define a macro for the CC flags CFLAGS = -c -g # A rule for building a object file test.o: test.c test.h $(CC) $(CFLAGS) test.c 第21页,共49页。GNU make 的主要预定义变量GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表 1-5 给出了一些主要的 预定义变量,除这些
14、变量外,GNU make 还将所有的环境变量作为自己的预定义变量。 第22页,共49页。GNU make 的主要预定义变量第23页,共49页。隐含规则 (1)GNU make包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标。 GNU make 支持两种类型的隐含规则:后缀规则(Suffix Rule):后缀规则是定义隐含规则的老风格方法。后缀规则定义了将一个具有某个后缀的文件(例如,.c 文件)转换为具有另外一种后缀的文件(例如,.o 文件)的方法。每个后缀规则以两个成对出现的后缀名定义,例如,将 .c 文件转换为 .o 文件的后缀规则可定义为: .c .o:
15、 $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ 第24页,共49页。隐含规则 (2)模式规则(pattern rules):这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则。 模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个 % 号,同时可用来定义目标和依赖 文件之间的关系,例如下面的模式规则定义了如何将任意一个 x.c 文件转换为 x.o 文件: %.c:%.o $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ 第25页,共49页。make 运行GNU make 命令还有一些其他选项第26页,共49页。make
16、file 范例根据图示依赖关系编写一个makefile文件,依赖关系图如下:演示:例3第27页,共49页。make的实例ns.exe: link.o node.o ns.ogcc -o ns.exe link.o node.o ns.olink.o: link.c link.h.config.hgcc -c ode.o: node.c node.h config.hgcc -c s.o: ns.c ns.h config.hgcc -c ns.cclean:rm -f *.o第28页,共49页。使用automake和autoconf产生makefile在开始使用automake和autocon
17、f之前,请先确认系统已经安装以下的软件:GNU automakeGNU autoconfGNU m4PerlGNU Libtool (如果你需要产生shared library)automake 所产生的 makefile 除了可以做到程序的编译和链接,也已经把如何产生程序文件的操作,以及把安装程序都考虑进去了,所以源程序所存放的目录架构最好符合GNU的标准惯例,下面用hello.c来作为例子进行说明。第29页,共49页。使用automake和autoconf产生makefile在工作目录下建立一个新的子目录4,再在4下建立一个hello的子目录,这个目录将作为存放 hello 这个程序及其相
18、关文件的地方:#include int main(int argc, char* argv) printf(Hello, GNU!n); return 0;演示:例4第30页,共49页。使用automake和autoconf产生makefile具体步骤执行autoscan命令生成configure.scan 编辑修改configure.scan文件,并且把文件名改成configure.in autoscan的作用在于扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等configure.in里的内容是一些宏定义,目的是为了检测程序运行所需要的一些参数或环境变量等第31页,共49页。
19、使用automake和autoconf产生makefile修改configure.in文件,最主要的是手动添加AM_INIT_AUTOMAKE宏,并修改AC_OUTPUT指定Makefile文件的生成位置第32页,共49页。使用automake和autoconf产生makefile执行aclocal命令生成aclocal.m4文件执行autoheader命令,通过configuer.in中的某些宏运行上一步生成的m4文件,生成config.h.inaclocal.m4是一个perl脚本程序执行autoconf生成configure脚本 新建并编辑Makefile.am文件configure是一
20、套配置软件源代码的脚本。autoconf命令依据configure.in文件来生成configure脚本,途中利用了aclocal.m4文件Makefile.am文件中定义的宏和目标,会指导automake生成指定的代码第33页,共49页。使用automake和autoconf产生makefile执行automake -add-missing命令生成Makefile.in文件新建Makefile.am文件,指定生成的可执行文件和源文件之后通过autoconf生成的configure脚本,配合automake生成的Makefile.in文件,就可以产生一份符合GNU Makefile惯例的Mak
21、efile第34页,共49页。使用automake和autoconf产生makefile最后执行 ./configure :现在你的目录下已经产生了一个Makefile文件,执行make命令就可以开始编译hello.c 成执行文件,最后执行./hello:# makegcc -DPACKAGE=hello -DVERSION=1.0 -I. -I. -g -O2 -c hello.cgcc -g -O2 -o hello hello.o# ./helloHello! GNU!第35页,共49页。6.3.3 GDB :Linux调试工具Linux系统中包含了GNU 调试程序gdb,它是一个用来调
22、试C和 C+ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。gdb所提供的一些功能如下所示:运行程序,设置所有的能影响程序运行的参数和环境;控制程序在指定的条件下停止运行;当程序停止时,可以检查程序的状态;修改程序的错误,并重新运行程序; 动态监视程序中变量的值; 可以单步执行代码,观察程序的运行状态。 第36页,共49页。GDB调试说明gdb程序调试的对象是可执行文件,而不是程序的源代码文件。如果要让产生的可执行文件可以用来调试,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映
23、射以及源代码的行号。gdb 利用这些信息使源代码和机器码相关联。可在 makefile 中如下定义 CFLAGS 变量: CFLAGS = -g rootstu1 no10# gcc -g hello_error.c -o hello_error rootstu1 no10# gdb第37页,共49页。GDB的帮助在 gdb 提示符处键入help,将列出命令的分类,键入 help 后跟命令的分类名,可获得该类命令的详细清单。 如果想要了解某个具体命令(比如break)的帮助信息,在gdb提 示符下输入下面的命令:help breakbreak的作用是设置断点aliases:命令别名breakp
24、oints:断点定义data:数据查看iles:指定并查看文件internals:维护命令running:程序执行stack:调用栈查看statu:状态查看tracepoints:跟踪程序执行。另一个获得gdb帮助的方法是浏览gdb的手册页。# man gdb第38页,共49页。GDB的常用命令gdb的基本命令gdb filename其中filename是要调试的可执行文件。用这种方式运行gdb可以直接指定想要调试的程序。这和启动gdb后执行file filename命令效果完全一样。gdb支持很多的命令且能实现不同的功能。这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令,下面列
25、出了在使用gdb 调试时会用到的一些命令。file命令:装入想要调试的可执行文件cd命令:改变工作目录第39页,共49页。gdb 常用命令pwd命令:打印当前工作日录。 run命令:执行当前被调试的程序。 list命令:列出正在调试的应用程序的源代码。 break命令:设置断点。 kill命令:停止正在调试的应用程序。tbreak命令;设置临时断点。它的语法与break相同。区别在于用tbreak设置的断点执行一次之后立即消失。watch命令:设置监视点,监视表达式的变化。continue命令: 继续正在执行调试的程序。该命令用在程序由于处理信号或断点而导致停止运行的情况。第40页,共49页。
26、gdb 常用命令awatch命令:设置读写监视点。当要监视的表达式被读或写时将应用程序挂起。它的语法与watch命令相同。rwatch命令:设置读监视点,当监视表达式被读时将程序挂起,等侍调试。此命令的语法与watch相同。next命令:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经run,开始了代码的执行。 第41页,共49页。gdb 常用命令step命令:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。display命令:在应用程序每次停止运行时
27、显示表达式的值。info break命令:显示当前断点列表,包括每个断点到达的次数info files命令:显示调试文件的信息。 info func命令:显示所有的函数名。 第42页,共49页。gdb 常用命令info local命令:显示当前函数的所有局部变量的信息。 info prog命令:显示调试程序的执行状态。print命令;显示表达式的值。 delete命令:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。 Shell命令:执行Linux Shell命令。 make命令:不退出gdb而重新编译生成可执行文件。 quit命令:退出gdb。第43页,共49页。GDB的简单实例#include static char buff256;static char *string;int main() printf(please input a string:n); gets(string); prin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考生物一轮复习 备用题库 03 课时作业3 走近细胞、细胞膜与细胞核 【正文】【作业手册】
- 采购部门管理手册
- 2024年晋宏职业学院高职单招职业适应性测试考试题库及参考答案详解一套
- 2026年郑州铁路职业技术学院单招职业技能考试模拟试卷及答案详解(有一套)
- 2027年冀中职业学院高职单招职业技能考试题库带答案详解(突破训练)
- 2025年锦河职业学院单招职业技能考试题库及完整答案详解【易错题】
- 2024年陕西西安鄠邑职业学院高职单招职业技能考试模拟试卷【B卷】附答案详解
- 2025年四川中医药高专单招职业技能考试题库及参考答案详解【巩固】
- 2027年湖北宜昌三峡职业学院高职单招职业技能考试题库及完整答案详解(考点梳理)
- 2027年汉中职业技术学院单招职业技能考试题库含完整答案详解【名校卷】
- 2026年重庆市“五方面人员”选拔乡镇领导班子考试历年参考题库(含完整答案)
- (正式版)DB31 650-2020 《非织造布单位产品能源消耗限额》
- (已压缩)广东省工程勘察设计服务成本取费导则(2024版)
- ChatGPT在学术领域的应用及其影响因素:群体差异分析
- 《职场女性心理健康》课件
- 2025年大唐同舟科技有限公司招聘笔试参考题库含答案解析
- DL∕T 5776-2018 水平定向钻敷设电力管线技术规定
- 数学计算题四年级上册100道
- 市政工程监理实施细则(完整版)
- 智能机器人技术导论PPT完整全套教学课件
- 电力建设工程量清单计价规范变电
评论
0/150
提交评论