版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第3章章 Linux下下C编程基础编程基础3.1 GCC程序编译3.2 GDB程序调试3.3 Makefile工程管理3.1 GCC程序编译程序编译o Linux系统下的gcc(GUN C Compiler)是GUN推出的功能强大、性能优越的多平台编译器,是GUN代表作之一。gcc可以在多种硬件平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%-30%。o Gcc编译器能将C、C+语言源程序、汇编程序编译、链接成可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。o gcc又是一个交叉平台编译器,它能够在当前CPU平台
2、上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。 Gcc编译过程编译过程o Gcc编译程序时,编译过程可以被细分为四个阶段:n 预处理(Pre-Processing)n 编译(Compiling)n 汇编(Assembling)n 链接(Linking)文件类型文件类型o Gcc通过后缀来区别输入文件的类别:n.c为后缀的文件:C语言源代码文件n.a为后缀的文件:是由目标文件构成的库文件n.C、.cc或.cxx为后缀:C+源代码文件n.h为后缀的文件:头文件n.i为后缀的文件:是已经预处理过的C源代码文件n.ii为后缀的文件:是已经预处理过的C+源代码文件n.o为后
3、缀的文件:是编译后的目标文件n.s为后缀的文件:是汇编语言源代码文件n.S为后缀的文件:是经过预编译的汇编语言源代码文件基本用法基本用法o Gcc最基本的用法是:最基本的用法是: gcc 选项 要编译的文件 选项 目标文件 目标文件可以缺省,默认生成的可执行文件命名为:a.outn gcc编译选项大约有100多个,其中多数我们不常用,这里介绍其中最基本、最常用的参数。o 总体选项o 告警选项o 优化选项o 体系结构相关选项o 选项由-和字母组成,如-c、-o等。起步(演示)起步(演示)hello.c#include int main()printf(“hello worldn”);return
4、 0;编译和运行程序:#gcc hello.c o hello#./hello输出:hello worldgcc -预处理预处理o 在该阶段,对包含的头文件(#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
5、unsigned char *, _const unsigned char *, _const unsigned char *, unsigned char *, size_t *);# 2 hello.c 2int main()printf(Hello! This is our embedded world!n);return 0;gcc -编译阶段编译阶段o 接下来进行的是编译阶段,在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
6、。rootlocalhost gcc# gcc S hello.i o hello.sgcc -汇编阶段汇编阶段o 汇编阶段把编译阶段生成的汇编程序.s转成目标文件.o,使用-c选项,可以把汇编程序转换成二进制目标代码。rootlocalhost gcc# gcc c hello.s o hello.ogcc链接阶段链接阶段o 把目标代码链接起来,转换成为可执行文件。 rootlocalhost gcc# gcc hello.o o helloo 有个重要概念:函数库。程序中没有定义printf函数,stdio.h中也只是printf的声明,printf在哪里呢?事实上,该函数的实现在名字为l
7、ibc.so.6的库文件当中,该库文件在/usr/lib目录下,没有特别指定,gcc会自动到该目录下搜索库文件。该库是动态库。编译选项编译选项o -o output_filename:确定可执行文件的名称为output_filename,如果不给出该选项,gcc会给出预设的可执行文件a.outo -c:只编译,不连接成可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。o -S:生成一个后缀为.s的汇编文件o -E:对源代码只进行预处理o -g:产生调试工具所必须的符号信息,要相对编译的程序进行调试,就必须加入这个选项。编译选项编译选项o -O:对程序进行优化编译、链接,采
8、用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应的要慢一些。o -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”
9、,result);return 0;编译选项编译选项o gcc optimize.c o optimizetime ./optimize (执行文件)o Gcc O optimize.c o optimizetime ./optimize对比两次编译执行结果,后面执行的程序性能有很大幅度的提高编译选项编译选项o -I dirname:将dirname所指的目录加入到程序头文件搜索目录列表中。o C程序中头文件包含两种情况:n #include n #include “B.h”n 对于预处理程序在系统预设的头文件目录(如:/usr/include)中搜索相应的文件,而“”是在当前目录中搜索头文件
10、。这个选项的作用是告诉编译器,如果当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找例:gcc foo.c I /home/include o foo编译选项编译选项o -L dirname:将dirname所指出的目录加入到库文件的目录列表中去。在默认状态下,连接程序lib在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设的路径中寻找。编译选项编译选项o -lname:在连接时,装载名字为“libname.a或libname.so”的库函数,该库函数位于系统预设的目录或者由-L选项确定的目录下。例如
11、:-lm表示连接名为“libm.a”的数学函数库。例如:gcc foo.c L /home/lib lm o foo编译选项编译选项o -static:静态连接库文件例如:gcc static hello.c o helloo -shared:共享库文件,库有共享和静态两种:共享通常用.so为后缀,静态用.a为后缀。n当使用静态库时,连接器找出程序所需的函数,然后将它拷贝到可执行文件,一旦连接成功,静态程序库也就不再需要了。n共享库在执行程序内留下一个标记,指明当程序执行时,首先必须载入这个库,由于共享库节省空间,linux进行连接的缺省是首先连接共享库。o -fpic或fPIC:用于产生与位
12、置无关的目标代码,以构造共享库编译选项编译选项o -Wall:生成所有警告信息o -w:不生成任何警告信息o -DMACRO:定义MACRO宏,等效于在程序中使用#define MACRO3.2 GDB程序调试程序调试o GDB是GUN发布的一款功能强大的程序调试工具。GDB主要完成以下3个方面的功能:n 启动被调试程序n 让被调试程序在指定位置停住n 当程序被停住时,可以检查程序状态(变量值)起步起步#include int main()int i;long result=0.0;for(i=1;i=100;i+)result+=i;printf(“result = %d n”,result
13、);return 0;GDB快速进阶快速进阶o 编译生成可执行文件ngcc g test.c o testo 启动GDBngdb testo 在main函数处设置断点nbreak maino 运行程序nRuno 单步运行nnexto 继续运行ncontinueGDB命令命令o 启动GDBngdb 调试程序名ngdb file 调试程序名o list(l) 查看程序o break(b)函数名:在某函数入口处添加断点o break(b)行号:在指定行添加断点o break(b)文件名:行号 在指定文件的指定行添加断点o break(b)行号 if 条件 当条件为真时,指定行号处断点生效,例如:b
14、5 if i=10,当i等于10时第5行断点生效GDB命令命令o info break 查看所有设置的断点o delete 断点编号 删除断点o run(r) 开始运行程序o next(n) 单步运行程序(不进入子函数)o step(s) 单步运行程序(进入子函数)o continue(c) 继续运行程序o print(p) 变量名 查看指定变量值o finish 运行程序,直到当前函数结束o watch 变量名 对指定变量进行监控o quit(q) 退出gdb3.3 Makefile工程管理工程管理o Linux程序员必须学会使用GUN make来构建和管理自己的软件工程。GUN能使整个软件
15、工程的编译、链接只需要一个命令就可以完成。o make在执行时,需要一个命名为Makefile的文件。Makefile文件描述了整个工程的编译、链接等规则。其中包括:工程中哪些源文件需要编译以及如何编译;需要创建那些库文件以及如何创建这些库文件,如何最后产生我们想要的可执行文件。Makefileo makefile是make读入的惟一配置文件,因此本节的内容实际就是讲述makefile的编写规则。在一个makefile中通常包含如下内容: 需要由make工具创建的目标体(target),通常是目标文件或可执行文件; 要创建的目标体所依赖的文件(dependency_file); 创建每个目标体
16、时需要运行的命令(command),这一行必须以制表符(tab键)开头。Makefile(例)(例)hello:main.o func1.o func2.ogcc main.o func1.o func2.o o hellomain.o:main.cgcc c main.cfunc1.o:func1.cgcc c func1.cFunc2.o:func2.cgcc c func2.c.PHONY:cleanclean:rm f hello main.o func1.o func2.oMakefile(术语术语)o 规则:用于说明如何生成一个或多个目标文件,规则格式如下:target: depe
17、ndency_filecommand目标 依赖 命令main.o:main.cgcc c main.c目标 依赖 命令注:命令需要以TAB键开始目标目标o 在makefile中,规则的顺序是很重要的,因为Makefile中只应该有一个最终目标,其他的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能有很多,但是第一条规则中的目标将被确立为最终目标。o Make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为两者之一时,可以使用如下方法指定:make f 文件名伪目标伪目标o Makef
18、ile中把那些没有任何依赖只有执行动作的目标称为伪目标,phony targets.PHONY:cleanclean:rm f hello main.o func1.o func2.oo .PHONY将clean目标声明为伪目标变量变量o hello:main.o func1.o func2.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 hellomakefilema
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理职业素养与伦理
- 2025年家庭过山车运营数据分析报告
- 2025年家常凉菜做法大全
- 继电器封装工岗前核心技能考核试卷含答案
- 仪表拆解工岗前绩效目标考核试卷含答案
- 测井绘解工操作规程能力考核试卷含答案
- 汽车铸造生产线操作工安全技能测试考核试卷含答案
- 涂装预处理工标准化知识考核试卷含答案
- 2026年新科教版高中高二数学下册第三单元随机变量方差计算卷含答案
- 2026年新科教版初中七年级语文上册第一单元记叙文写作技巧提升卷含答案
- 2026福建福州开大学川智慧教育科技有限公司招聘财务主管笔试参考题库及答案解析
- 2026下半年湖南益阳市资阳区事业单位招聘工作人员16人易考易错模拟试题(共500题)试卷后附参考答案
- 2026浙江杭州市西湖区人民政府西溪街道办事处招聘编外合同制工作人员2人笔试模拟试题及答案解析
- 环氧彩砂自流平地坪施工及验收规范
- 2026年科目1驾驶技术模拟题库及完整答案详解
- 六化建设培训
- 2026年甘肃省平凉市辅警人员招聘考试真题解析含答案
- TSG08-2026《特种设备使用管理规则》全面解读课件
- 【答案】《以案说法》(中南财经政法大学)章节作业慕课答案
- 云南省2025年普通高中学业水平合格性考试历史试题
- 《扣件式钢管脚手架安全技术规范》JGJ130-2023
评论
0/150
提交评论