ImageVerifierCode 换一换
格式:PPT , 页数:35 ,大小:211.50KB ,
资源ID:3815740      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-3815740.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第3章linux下C编程基础.ppt)为本站会员(dzzj200808)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

第3章linux下C编程基础.ppt

1、第3章 Linux下C编程基础,3.1 GCC程序编译 3.2 GDB程序调试 3.3 Makefile工程管理,3.1 GCC程序编译,Linux系统下的gcc(GUN C Compiler)是GUN推出的功能强大、性能优越的多平台编译器,是GUN代表作之一。gcc可以在多种硬件平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%-30%。 Gcc编译器能将C、C+语言源程序、汇编程序编译、链接成可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。 gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构

2、的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。,Gcc编译过程,Gcc编译程序时,编译过程可以被细分为四个阶段: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking),文件类型,Gcc通过后缀来区别输入文件的类别: .c为后缀的文件:C语言源代码文件 .a为后缀的文件:是由目标文件构成的库文件 .C、.cc或.cxx为后缀:C+源代码文件 .h为后缀的文件:头文件 .i为后缀的文件:是已经预处理过的C源代码文件 .ii为后缀的文件:是已经预处理过的C+源代码文件 .o为后缀的文件:是编译后的目标文件 .s为后缀的文件

3、:是汇编语言源代码文件 .S为后缀的文件:是经过预编译的汇编语言源代码文件,基本用法,Gcc最基本的用法是:gcc 选项 要编译的文件 选项 目标文件目标文件可以缺省,默认生成的可执行文件命名为:a.out gcc编译选项大约有100多个,其中多数我们不常用,这里介绍其中最基本、最常用的参数。 总体选项 告警选项 优化选项 体系结构相关选项 选项由-和字母组成,如-c、-o等。,起步(演示),hello.c #include int main() printf(“hello worldn”);return 0; 编译和运行程序: #gcc hello.c o hello #./hello 输出

4、:hello world,gcc -预处理,在该阶段,对包含的头文件(#include)和宏定义(#define、#ifdef等)进行处理 。可以使用gcc的选项“-E” 让gcc在预处理结束后停止编译过程。 rootlocalhost gcc# gcc E hello.c o hello.i/* hello.i */ typedef int (*_gconv_trans_fct) (struct _gconv_step *,struct _gconv_step_data *, void *,_const unsigned char *,_const unsigned char *,_cons

5、t unsigned char *, unsigned char *,size_t *); # 2 “hello.c“ 2 int main() printf(“Hello! This is our embedded world!n“);return 0; ,gcc -编译阶段,接下来进行的是编译阶段,在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。rootlocalhost gcc# gcc S hello.i o hello.s

6、,gcc -汇编阶段,汇编阶段把编译阶段生成的汇编程序.s转成目标文件.o,使用-c选项,可以把汇编程序转换成二进制目标代码。rootlocalhost gcc# gcc c hello.s o hello.o,gcc链接阶段,把目标代码链接起来,转换成为可执行文件。rootlocalhost gcc# gcc hello.o o hello有个重要概念:函数库。程序中没有定义printf函数,stdio.h中也只是printf的声明,printf在哪里呢?事实上,该函数的实现在名字为libc.so.6的库文件当中,该库文件在/usr/lib目录下,没有特别指定,gcc会自动到该目录下搜索库文

7、件。该库是动态库。,编译选项,-o output_filename:确定可执行文件的名称为output_filename,如果不给出该选项,gcc会给出预设的可执行文件a.out -c:只编译,不连接成可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。 -S:生成一个后缀为.s的汇编文件 -E:对源代码只进行预处理 -g:产生调试工具所必须的符号信息,要相对编译的程序进行调试,就必须加入这个选项。,编译选项,-O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应的要慢一

8、些。 -O2:比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。,编译选项举例,#include int main() double counter;double result;double temp;for(counter=0;counter2000.0*2000.0*2000.0/20.0+2020;counter+=(5-1)/4)temp=counter/1979;result=counter;printf(“Result is %lfn”,result);return 0; ,编译选项,gcc optimize.c o optimizetime ./optimize (执行文

9、件)Gcc O optimize.c o optimizetime ./optimize对比两次编译执行结果,后面执行的程序性能有很大幅度的提高,编译选项,-I dirname:将dirname所指的目录加入到程序头文件搜索目录列表中。 C程序中头文件包含两种情况: #include #include “B.h” 对于预处理程序在系统预设的头文件目录(如:/usr/include)中搜索相应的文件,而“”是在当前目录中搜索头文件。这个选项的作用是告诉编译器,如果当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找 例:gcc foo.c I /home/include o foo

10、,编译选项,-L dirname:将dirname所指出的目录加入到库文件的目录列表中去。在默认状态下,连接程序lib在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设的路径中寻找。,编译选项,-lname:在连接时,装载名字为“libname.a或libname.so”的库函数,该库函数位于系统预设的目录或者由-L选项确定的目录下。例如:-lm表示连接名为“libm.a”的数学函数库。 例如:gcc foo.c L /home/lib lm o foo,编译选项,-static:静态连接库文件例如:gcc stat

11、ic hello.c o hello -shared:共享库文件,库有共享和静态两种:共享通常用.so为后缀,静态用.a为后缀。 当使用静态库时,连接器找出程序所需的函数,然后将它拷贝到可执行文件,一旦连接成功,静态程序库也就不再需要了。 共享库在执行程序内留下一个标记,指明当程序执行时,首先必须载入这个库,由于共享库节省空间,linux进行连接的缺省是首先连接共享库。 -fpic或fPIC:用于产生与位置无关的目标代码,以构造共享库,编译选项,-Wall:生成所有警告信息 -w:不生成任何警告信息 -DMACRO:定义MACRO宏,等效于在程序中使用#define MACRO,3.2 GDB

12、程序调试,GDB是GUN发布的一款功能强大的程序调试工具。GDB主要完成以下3个方面的功能: 启动被调试程序 让被调试程序在指定位置停住 当程序被停住时,可以检查程序状态(变量值),起步,#include int main() int i;long result=0.0;for(i=1;i=100;i+)result+=i;printf(“result = %d n”,result);return 0; ,GDB快速进阶,编译生成可执行文件 gcc g test.c o test 启动GDB gdb test 在main函数处设置断点 break main 运行程序 Run 单步运行 next

13、 继续运行 continue,GDB命令,启动GDB gdb 调试程序名 gdb file 调试程序名 list(l) 查看程序 break(b)函数名:在某函数入口处添加断点 break(b)行号:在指定行添加断点 break(b)文件名:行号 在指定文件的指定行添加断点 break(b)行号 if 条件 当条件为真时,指定行号处断点生效,例如:b 5 if i=10,当i等于10时第5行断点生效,GDB命令,info break 查看所有设置的断点 delete 断点编号 删除断点 run(r) 开始运行程序 next(n) 单步运行程序(不进入子函数) step(s) 单步运行程序(进入

14、子函数) continue(c) 继续运行程序 print(p) 变量名 查看指定变量值 finish 运行程序,直到当前函数结束 watch 变量名 对指定变量进行监控 quit(q) 退出gdb,3.3 Makefile工程管理,Linux程序员必须学会使用GUN make来构建和管理自己的软件工程。GUN能使整个软件工程的编译、链接只需要一个命令就可以完成。 make在执行时,需要一个命名为Makefile的文件。Makefile文件描述了整个工程的编译、链接等规则。其中包括:工程中哪些源文件需要编译以及如何编译;需要创建那些库文件以及如何创建这些库文件,如何最后产生我们想要的可执行文件

15、。,Makefile,makefile是make读入的惟一配置文件,因此本节的内容实际就是讲述makefile的编写规则。在一个makefile中通常包含如下内容: 需要由make工具创建的目标体(target),通常是目标文件或可执行文件; 要创建的目标体所依赖的文件(dependency_file); 创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头。,Makefile(例),hello:main.o func1.o func2.ogcc main.o func1.o func2.o o hello main.o:main.cgcc c main.c f

16、unc1.o:func1.cgcc c func1.c Func2.o:func2.cgcc c func2.c .PHONY:clean clean:rm f hello main.o func1.o func2.o,Makefile(术语),规则:用于说明如何生成一个或多个目标文件,规则格式如下:target: dependency_filecommand目标 依赖 命令main.o:main.cgcc c main.c目标 依赖 命令注:命令需要以TAB键开始,目标,在makefile中,规则的顺序是很重要的,因为Makefile中只应该有一个最终目标,其他的目标都是被这个目标所连带出来

17、的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能有很多,但是第一条规则中的目标将被确立为最终目标。 Make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为两者之一时,可以使用如下方法指定:make f 文件名,伪目标,Makefile中把那些没有任何依赖只有执行动作的目标称为伪目标,phony targets.PHONY:cleanclean:rm f hello main.o func1.o func2.o.PHONY将clean目标声明为伪目标,变量,hello:main.o func1.o func2.

18、ogcc main.o func1.o func2.o o hello 思考:如果要为hello目标添加一个依赖,如func3.o,该如何修改?hello:main.o func1.o func2.o func3.ogcc main.o func1.o func2.o func3.o o hello 另一种:OBJ=main.o func1.o func2.o func2.ohello:$(OBJ)gcc $(OBJ) o hello,makefile中常用的预定义变量,自动化变量,在makefile中,存在系统默认的自动化变量 $:代表所有的依赖文件 $:代表目标 $:代表第一个依赖文件 hello:main.o func1.o func2.ogcc main.o func1.o func2.o o hello 等价: hello:main.o func1.o func2.ogcc $ -o $,makefile中常见的自动变量,杂项,Makefile中“#”字符后的内容被视作注释:取消回显 hello:hello.cgcc hello.c o hello,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报