第2章Linux编程环境_第1页
第2章Linux编程环境_第2页
第2章Linux编程环境_第3页
第2章Linux编程环境_第4页
第2章Linux编程环境_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章Linux编程环境2.1GCC编译器的使用2015年9月用GCC编译器生成可执行程序文件用vi编辑器生成源程序文件用C语言编写程序用GCC编译和运行一个简单程序hello.c执行可执行程序文件#include<stdio.h>voidmain(){printf(“helloworld!\n”);}输入命令vihello.c编辑程序并保存。输入命令gcchello.c生成执行文件:a.out执行文件:a.out./a.out2.1GCC编译器的使用2.1.1GCC编译器简介2.1.2GCC常用选项:预处理控制2.1.3GCC常用选项:编译及警告信息控制选项2.1.4GCC常用选项:C语言标准控制选项和程序调试及优化选项2.1.5GCC常用选项:搜索路径控制和GCC链接选项2.1.6利用GCC创建库文件2015年9月2.1.1

GCC编译器简介2015年9月GCC是GNU编译器集合“GNUCompilerCollection”的缩写,包括C、C++、Java等语言的编译。Linux环境下C语言程序开发过程用编辑程序(vi/vim、Emacs)编辑源程序,生成源程序文件;使用编译软件Gcc对源程序文件进行编译,可生成执行文件;使用GDB调试器软件对程序进行调试;生成最终可执行程序。实际上,可使用Linux环境下提供的可视化集成开发环境进行程序开发,如基于QT库的KDevelop、基于GTK库的Anjuta、Kylix等开发环境。gcc--version获得GCC版本。Gcc编译器的工作过程

Gcc可以编译C、C++以及ObjectC的源程序。其编译过程分为四个阶段:预处理编译汇编链接可以在任意一个编译阶段暂停编译过程,并检查相应的输出信息。2015年9月源文件预处理编译汇编链接可执行程序GCC的用法:gcc[选项]文件名2.1.2GCC常用选项:预处理控制2014年2月预处理控制选项-E选项GCC仅处理输入文件-D

name选项预定义名为name的宏,值为1-undef选项取消与操作系统或GCC相关的宏定义-Dname=definition选项,定义宏的值-Uname选项取消宏定义2.1.3编译及警告信息控制选项2015年9月编译警告信息控制选项-o选项指定GCC输出文件-c选项只编译为目标代码,不汇编及链接-w选项禁止警告信息-S选项只编译为.s汇编语言文件-Wall选项显示警告信息-Werror选项警告转换为错误2.1.4

C语言标准控制选项和程序调试及优化选项C语言标准控制选项-ansi选项,等价于–std=c89-std=选项-pedantic选项-xlanguage选项指明程序语言程序优化选项-g选项编译后代码包含GDB所需信息-O选项进行优化-O0~-O3选项进行0级到3级优化2015年9月2.1.5GCC常用选项:搜索路径控制和GCC链接选项

头文件搜索路径Idir指定头文件搜索目录例子:gcc–I/home/david/include–odaviddavid.c库文件搜索路径-llibrary指定连接库文件-Ldir指定连接库所在目录gccdavid.c–L/home/david/lib–ldavid–odavid连接控制-static选项-shared选项-发fPIC选项2015年9月2.1.6利用GCC创建库文件静态库模型2015年9月……调用函数a……函数a机器代码……函数a的代码……源程序静态库……调用函数a……函数a机器代码……函数a的链接信息……源程序共享库动态加载共享库运行时执行函数a静态库和动态库模型2015年9月程序A静态库*.a程序A程序B静态库*.a程序B共享库(*.so)静态库的代码被复制到应用程序中动态库代码被多个应用程序在运行时共享GCC创建静态库

定义函数原型,生成头文件,例如calc.hdoubleaver(double,double);doublesum(double,double);实现函数aver,生成文件aver.c

2015年9月#include<calc.h>doubleaver(doublenum1,doublenum2){return(num1+num2)/2.0;}实现第2个函数sum,生成文件sum.c#include<calc.h>doublesum(doublenum1,doublenum2){return(num1+num2)/2.0;}编译并生成静态库gcc-c–oaver.oaver.cgcc–c–osum.osum.carrclibmycalc.aaver.osum.o使用静态库中的函数2015年9月在程序中调用函数aver和sum,编写程序main.c#include<stdio.h>#include“calc.h”intmain(){doublev1,v2,m,sum2;v1=3.2;v2=8.9;m=aver(v1,v2);sum2=sum(v1,v2);printf(“m=%5.2fsum2=%5.2f\n”,m,sum2);return0;}编译命令如下:

gccmain.c–Bstatic–L.–lmycalc-ostatic-mainGCC创建动态库文件使用前述的鱼啊程序文件aver.csum.cmain.c2015年9月gcc-c–fpicaver.c–oaver.ogcc-c–fpicsum.c–osum.o编译生成共享库gcc-sharedlibmycalc.soaver.osum.o应用共享库gccmain.c-L.–lmycalc-o-shared-main运行共享库LD_LIBRARY_PATH=.expertLD_LIBRARY_PATH./shared-main2.2GDB调试器的使用GDB通过4种作用帮助查找程序中的错误启动程序并能够影响程序行为;根据指定条件停止程序的执行;当程序退出时,检查发生这种情况的原因;改变程序内部,因而可以不断试验查找程序缺陷。2015年9月2.2.1GDB调试器的使用2015年9月用-g选项编译源文件在命令终端输入gdb命令用help命令获得帮助通过调试命令进行程序调试用quit命令退出或CTRL-D退出GDB常用命令2015年9月命令缩写命令功能listl显示多行源代码breakb设置断点infoi描述程序状态runr开始运行程序displaydisp查看变量steps执行下一条语句,函数调用进入函数第一个语句nextn执行下一条语句,函数调用会直接执行不进入内部printp打印内部变量continuec继续程序执行直到遇到下一断点setvar设置变量的值startst开始执行程序,在main函数第一条语句前停下file装入需要调试的程序killk终止正在调试的程序watch监视变量值的变化GDB常用命令(续)2015年9月命令缩写命令功能backtracebt查看函数调用的信息framef查看栈帧quitq退出GDB环境GDB调试实例:以下述程序的调试为例进行操作示范:#include<stdio.h>#include<stdlib.h>charbuff[255];char*string;intmain(){printf(“Pleaseinputastring:”);gets(string);printf(“\nYourstringis:%s\n”,string);return0;}2.3Make工具2.3.1第一个Makefile2.3.2Makefile编写规则2.3.3Makefile的基本工作原理及过程2.3.4Makefile文件2015年9月2.3.1第一个Makefile例子:程序文件:main.chello1.hhello2.hhello1.chello2.c。2015年9月/*hello1.h*/#ifndef_HELLO_1_H#define_HELLO_1_H#include<stdio.h>voidhello1(char*mess);#endif/*hello2.h*/#ifndef_HELLO_2_H#define_HELLO_2_H#include<stdio.h>voidhello2(char*mess);#endif/*hello1.c*/#include“hello1.h”voidhello1(char*mess){printf(“Thisishello1print%s\n”,mess);}/*hello2.c*/#include“hello2.h”voidhello1(char*mess){printf(“Thisishello2print%s\n”,mess);}2.3.1第一个Makefile2015年9月#Makefilemain:main.ohello1.ohello2.ogcc-omainmain.ohello1.ohell2.omain.o:main.chello1.hhello2.hgcc–cmain.chello1.o:hello1.chello1.hgcc–chello1.chello2.o:hello2.chello2.hgcc–chello2.cclean:rmmainhello1.ohello2.omain.o文件:Makefile#include“hello1.h”#include“hello2.h”#include<stdio.h>intmain(intargc,char*argv[]){hello1(“Hello”);hello2(“world”);}文件main.c执行:

make./main为了清除文件,执行:

makeclean2.3.2Makefile编写规则Makefile管理整个工程的编译、链接、执行、清除等一系列活动的规则。Makefile文件由一系列规则组成,Make工具读取这些规则所指定的行为进行操作。规则如下:

目标:依赖文件列表<TAB>执行命令

例如:前述Makefile文件中main:main.ohello1.ohello2.ogcc–omainmain.ohello1.ohello2.o2015年9月2.3.3Makefile的基本工作原理及过程在默认情况下,Make工具从Makefile文件中的第一个目标开始,第一个目标称为默认目标。在第一个例子中,默认目标是更新可执行程序main,因此作为第一条规则。执行make命令时,读取当前目录的Makefile文件,从第一条规则开始处理。该规则是将main.o链接成为可执行程序,但在执行命令前,make必须处理该规则所依赖的其他规则。生成main依赖main.ohello1.ohello2.o这3个目标文件,然后这些文件根据他们的规则进行处理。2013年10月用变量表示重复出现的文件名例如:

main:main.ohello1.ohello2.ogcc–omainmain.ohello1.ohello2.o可引入变量obj表示重复的文件名串

obj=main.ohello1.ohello2.omain:$(obj)gcc–omain$(obj)2015年9月使用Make的隐含规则使用Make的隐含规则可简化MakefileMake可以自动推导目标所依赖的文件。Make的隐含规则:可以根据后缀为.c的源程序文件使用gcc命令自动更新或者产生同名的.o文件。例如:

gcc–cmain.c–omain命令自动将main.c编译为main.o使用隐含规则和变量,前述Makefile文件可写成:2015年9月obj=main.ohello1.ohello2.oMain:$(obj) gcc–omain$(obj)Hello1.o:hello1.hHello2.o:hello2.hClean:rm$(obj)2.3.4Makefile文件1、Makefile文件的组成2015年9月Makefile组成显示规则如何更新一个或多个目标文件变量定义指令注释:以#开始隐式规则2.3.4Makefile文件2规则

目标:一个或多个(空格分开)文件名

命令:前面必须是<TAB>键

告诉make目标何时过期以及如何更新文件。

依赖关系:普通依赖关系、顺序依赖模式

文件名中通配符的使用:如*.c

查找所依赖文件的路径:Makefile中使用VPATH变量指定依赖文件及目标文件的搜索路径。

还可使用vpath指令,就是按vpath指令的顺序查找。

用%表示0个或多个字符,vpath的例子vpath%.cabcvpath%.xyzvpath%.cfoo2015年9月2.3.4Makefile文件伪目标:指不是文件名称而只是make时要执行的某些命令的目标。例如:clean:rm*.omain

执行makeclean时,删除.o文件和main文件。

若存在文件clean,将不执行rm命令。

解决方法:将clean规则改成.PHONY:cleanclean:rm*.omain2013年10月2.3.4Makefile文件3规则的命令:告诉make该规则需要做什么事情。命令由shell命令构成。可以是1条或多条,按顺序执行。

命令执行结果可使目标文件得到更新。

命令行以<Tab>键开始,除非放在目标及其依赖文件后面,以分号分开。命令中可以用变量。命令实例:

LIST=onetwothreeall:foriin$(LIST);doecho$i;done2015年9月命令回显命令的执行递归执行make命令2.3.4Makefile文件4隐式规则:使用make内嵌的隐式规则,在Makefile中就不需要明确给出构建某一目标的命令,甚至不需要规则。Make会根据已存在的或者所依赖的源文件类型来调用相应的隐式规则。例

main:foo.obar.o

gcc–omainfoo.obar.o$(CFLAGS)$(LDFLAGS)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论