版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章UNIX下的C语言开发环境,1。gcc和gdb,1.1 UNIX和C语言C是在UNIX操作系统早期广泛使用的一种通用编程语言,由贝尔实验室的DennisRitchie为UNIX的辅助开发而编写。c是所有UNIX版本的系统语言。几乎任何计算机都至少有一个可以使用的C编译器;它的语法和函数库在不同的平台上是统一的。20世纪80年代末,美国国家标准协会发布了一个名为ANSIC的C语言标准,它保证了不同平台上C语言的一致性。1.gcc和gdb,1.2 GNU C编译器GNU C编译器(gcc)是一个功能齐全的ANSIC兼容编译器,它是一个C编译器,适用于所有的UNIX系统。Gcc是一个超级编译器
2、,可以在各种硬件平台上编译可执行程序,其执行效率比一般编译器高200%。1.gcc和gdb,gcc编译过程:预处理,分析包含和预编译语句(如宏定义等)。)在源代码文件中。编译就是把C/C代码“翻译”成汇编代码。汇编:将第二步输出的汇编代码翻译成符合一定格式的机器码,用。o作为后缀。链接,将上一步生成的目标文件与系统库的目标文件和库文件进行链接,最终生成一个可以在特定平台上运行的可执行文件。1。在UNIX下的c语言开发环境下,gcc遵循文件类型的规定。C是后缀文件,C语言源代码文件;带后缀的文件。a是由目标文件组成的归档文件;带后缀的文件。c。抄送或。cxx是一个c源代码文件;带后缀的文件。h是
3、包含在程序中的头文件;带后缀的文件。我是预处理的C源代码文件;带后缀的文件。ii是预处理的c源代码文件;带后缀的文件。是一个目标代码文件;带后缀的文件。o是编译后的目标文件;带后缀的文件。s是汇编语言源代码文件;带后缀的文件。s是预编译的汇编语言源代码文件。1.gcc的最基本用法:gcc选项文件名选项是编译器所需的参数;文件名给出相关的文件名;/* Hello World . c */#包含Int main(int argc,char *argv)打印f(“你好,世界!n”);返回0;例如:$ gcc hello world.c $。/a.out $您好,世界!1。gcc和gdb,1.4 gc
4、c选项-墙:允许所有有用的警告;-o:定义输出文件;-c:只编译和生成。o目标文件,无链接;-I:设置头文件的搜索路径;-L:设置库文件的搜索路径;-o:O1、O2、O3、O4和O5的优化水平;-g:用于gdb调试,包括可执行程序中的标准调试信息;-w:关闭所有警告;-E:完成预处理/预编译停止;1。gcc和gdb,-Wall:允许所有有用的警告(建议始终使用此选项),/* bad.c */#包含int main (int argc,char * * argv) printf(“二加二等于% fn”,4);返回0;示例1: $ gcc坏。坏例子2:gcc wall bad。c o坏,1。gcc
5、和gdb,-o:定义输出文件,例如:编译多个源文件。你好。c-o helloworld,/*您好。h */void hello (constchar *),/* Hello . c */# include # include Hello . h void Hello(const char * name)printf(Hello,%s!n,名称);/* main . c */#包含hello.h int main (int argc,char * * argv)hello(world);返回0;1。gcc和gdb,-c:只编译和生成。o对象文件,无需链接,例如:编译多个源文件$ gcc-wall
6、-cmain . c $ gcc-wall-cmhello . c $ gcc main . o Hello . o-o Hello world,/* hello.h */void hello (const,/* Hello . c */# include # include Hello . h void Hello(const char * name)printf(Hello,%s!n,名称);/* main . c */#包含hello.h int main (int argc,char * * argv)hello(world);返回0;包含函数定义的目标文件应该出现在任何调用这些函数的
7、文件之后。1.gcc和gdb,重新编译和重新链接,例如:编译多个源文件$ gcc-wall-c main . c $ gcc main . o hello . o-o hello world,/* hello . h */void hello(const char * name);/* Hello . c */# include # include Hello . h void Hello(const char * name)printf(Hello,%s!n,名称);/* main . c */#包含hello.h int main (int argc,char *argv) hello(“
8、每个人”);返回0;世界-每个人,1。gcc和gdb,-l:链接外部库文件,它们是已编译并可链接到程序中的目标文件的集合。该库提供了一些最常用的系统函数,如在c的数学库中寻找平方根函数sqrt。库通常存储在带扩展名的特殊档案文件中。”一个“或”。所以。”,C标准库本身存储在“/usr/libc.a”中,它包含ANSI/ISO C标准指定的各种功能,并且是默认自动加载的库。/* sqrt . c */# include # include int main(int argc,char * * argv)double r=sqrt(3.0);(3.0的平方根是%fn,r);返回0;例如:$ gcc
9、-wallsqrt.c-o sqrt,ccbr6ojm.o3360在函数main : ccbr 6 ojm . o .(text0x 19):未定义的对sqrt的引用,1。gcc和gdb,-l:链接外部库文件,函数sqrt()没有在源程序中定义。为了使编译器能够将sqrt()函数链接到主程序“sqrt.c”,有必要提供“libm.a”库。例如:$ gcc-wall sqrt . c/usr/lib/libm.a-osqrt,/usr/lib/libm . a,-lm,$ gcc-wallsqrt.c-lm-osqrt,编译器选项-lNAME 尝试链接文件名 libNAME.a 1。gcc和gd
10、b之间的链接顺序,库,原则:包含函数定义的库应该出现在使用该函数的任何源文件和目标文件之后,示例1: $ gcc-wall-lmsqrt.c-osqrt(不正确)$ gcc-wallsqrt.c-lm-osqrt(正确),示例2:$ gcc-wall sqrt.c-lglpk-lm-o sqrt,程序“sqrt . c”使用GNU线性编程库“libglpk.a”,而后者又使用数学库“libm.a”,因此它gcc和gdb,-L:,/usr/local/lib/usr/lib/,示例:$ gcc-wall-l/tmp/lib sqrt . c-lm-o sqrt,-l/tmp/lib,1。gcc和
11、gdb,-I:设置头文件的搜索路径,如果头文件不在gcc使用的标准包含文件路径中,/usr/local/include/usr/include/,例如:$ gcc-wall-I/tmp/include sqrt . c-lm-o sqrt,-I/tmp/include,1。gcc和gdb,-o: o0,O1,O2,O3,O4操作系统选项选择优化以减小可执行文件大小。其目的是为内存和磁盘空间有限的系统生成尽可能小的可执行文件。大多数情况下,使用“-O0”进行调试,使用“-O2”进行开发和部署就足够了。1。gcc和gdb,一般来说,可执行文件不包含原始程序中源代码的任何引用信息,如变量名或行号可执
12、行文件只是编译器作为机器代码生成的指令序列。Gcc提供了“-g”调试选项,在目标文件和可执行文件中存储附加调试信息。当跟踪错误时,这些调试信息可以使源代码文件中的行从特定的机器代码指令映射。-g:存储调试信息,1。gcc和gdb,1.5 gdb调试和分析选项gdb基本命令文件加载要调试的可执行文件;Kill终止正在调试的程序;列表列出生成可执行文件的源代码的一部分;接下来执行一行源代码,但不输入函数;步骤执行一行源代码并进入函数;运行执行当前调试的程序;退出终止广发银行。手表使你能够监控一个变量的值,不管它什么时候被改变;Break在代码中设置一个断点,这将使程序在这里执行时挂起;Make使您
13、能够在不退出gdb的情况下重新生成可执行文件;Shell使您能够在不离开gdb的情况下执行UNIXshell命令。1。gcc和gdb,gdb调试示例,/* gdbtest。c */#包含int sum(int m);int main(int argc,char *argv) int I,n=0;总和(50);对于(I=1;i=501)n=1;printf(“1-50之和为%dn”,n);int sum(int m) int i,n=0;对于(I=1;I=m;I)n=I;printf(“1-m之和为%dn”,n);例如:$ gcc-wall-g gdbtest.c-o gdbtest,1。gcc
14、和gdb,1。启动gdb开始调试,1。$ gdb gdbtest,2。$ gdb (gdb)文件gdbtest,1。gcc和gdb,2。检查gdb中的源代码。示例:(gdb)列表,也可以缩写为l,1。gcc和gdb3.在gdb中设置断点;例1: (gdb) break9,也可以缩写为b;注意:在gdb中按行号设置断点意味着代码在运行到相应的行号之前被挂起;您可以在gdb中设置多个断点。1。gcc和gdb,3。在gdb中设置断点,示例2: (gdb) breaksum,设置函数断点,示例3:(gdb)break 8 if I=5,设置条件断点,1。gcc和gdb,4。查看断点,示例:(gdb)信
15、息中断1。gcc和gdb5.运行代码,例如:(gdb) run,也可以缩写为r;1.gcc和gdb6.检查变量,例如:(gdb)打印I,也可以缩写为p;I是变量名,“$N”是当前变量值的引用标记,1。gcc和gdb,7。单步操作可以使用命令“步骤”和“下一步”。它们之间的区别是,如果有函数调用,“step”将进入函数体,但“next”不会进入函数体;8。恢复程序的运行。使用命令“继续”恢复程序的正常运行,直到遇到下一个断点或程序结束;广发银行的程序有三种状态:“运行”、“暂停”和“停止”。在“暂停”状态下,函数的地址、参数和局部变量被推入“堆栈”,因此可以查看函数的各种属性;当功能处于“停止”
16、状态时,“堆栈”将自动取消,查看功能的信息将不会发送。,2。2.1为什么用make做项目经理?工作量问题:对于有多个(数百个)源文件的软件项目,只需要编写一个编译过程,而不是每次修改源文件后重复输入大量的文件名和编译命令进行编译;效率问题:make可以根据文件的时间戳自动发现更新后的源文件,并通过读取Makefile文件来编译更新后的源文件,同时只链接其他文件。2。make命令,2.2 Makefile格式Makefile是make读入的唯一配置文件。Makefile通常包含以下内容:make要创建的目标通常是目标文件或可执行文件;要创建的目标体所依赖的文件(dependency _ file);创建每个目标实体时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026辽宁报刊传媒集团(辽宁日报社)面向社会招聘高层次人才10人备考题库含答案详解(综合题)
- 2026四川泸州市雁林高级中学面向社会招聘备考题库含答案详解(基础题)
- 2026年文化和旅游部直属事业单位招聘社会人员备考题库(二)含答案详解(巩固)
- 2026江苏师范大学招聘体育教师4人备考题库附答案详解(精练)
- 2026年安庆桐城中学教师招聘备考题库及答案详解(真题汇编)
- 2026云南昆华医院投资管理有限公司(云南新昆华医院)招聘5人备考题库完整参考答案详解
- 2026广西干部学院(广西壮族自治区公务员培训中心)招聘编外工作人员5人备考题库附答案详解(培优a卷)
- 2026陕西西安雁塔区电子城社区卫生服务中心招聘备考题库附答案详解
- 2026中共重庆市大足区委宣传部公益性岗位工作人员招聘4人备考题库及答案详解(名校卷)
- 2026江苏徐州市新盛集团下属国通公司招聘3人备考题库含答案详解(a卷)
- 安徽交控集团招聘笔试冲刺题2025
- 攀枝花市2025届高三第一次统一考试(一统)物理试卷(含答案)
- 成都市河湖水生态综合治理技术导则
- 职业技术学校《直播运营实务》课程标准
- NB-T42011-2013往复式内燃燃气发电机组气体燃料分类、组分及处理技术要求
- NB-T+10488-2021水电工程砂石加工系统设计规范
- 合理用药知识健康讲座(完美版)课件
- 多格列艾汀使用指南2024课件
- MOOC 创业基础-暨南大学 中国大学慕课答案
- 安监部门加油站重点检查内容
- 《论语》知识考试参考题库(含答案)
评论
0/150
提交评论