好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Linux常用工具速查实用手册第5章编译器和工程管理器.ppt

41页
  • 卖家[上传人]:人***
  • 文档编号:590552301
  • 上传时间:2024-09-14
  • 文档格式:PPT
  • 文档大小:216KB
  • / 41 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第五章 编译器和工程管理器 •本章目的及内容•了解GNU Binutils工具了解最常用的GNU Binutils工具使用方法,包括链接工具ld、汇编工具as、目标复制工具objcopy以及反汇编工具objdump等•重点掌握gcc学会安装gcc及arm-linux-gcc工具软件,以及如何搭建gcc的交叉编译平台,重点掌握GCC编译流程及GCC编译选项•重点掌握make文件重点掌握的内容包括:make文件的语法规则、变量的使用、makefile中常用函数含义,以及make文件的编写流程•了解autotools的用法了解autotools中常用的工具链以及如何使用工具链自动创建Makefile文件 •GNU Binutils工具介绍 • 链接工具ldld是GNU binutils工具集其中的一个,是Linkers(链接器)的一种它的主要功能是把多个目标文件、库文件链接起来,并通过重定向它们的数据,完成符号解析,最终形成可执行文件•汇编工具as as工具主要用来将汇编语言源程序转换成二进制目标代码 •目标复制工具objcopy Objcopy工具可以将一种格式的目标文件转化为另外一种格式的目标文件,也可用来复制一个目标文件的内容到另一个文件中 •地址转换工具add2line 。

      add2line用来将地址转换成文件名或行号对,以便调试程序 •变量列举工具nm nm用来列出目标文件中的符号、变量(包括变量值和变量类型),使用它可以方便的帮助程序员定位及分析执行程序•创建档案工具ar ar工具可以帮助用户创建、修改档案文件(archive),也可以从档案文件中提取信息 •显示elf文件信息工具readelf readelf命令可以显示符号、段、二进制文件格式等信息,此工具在分析编译器如何从源代码创建二进制文件时非常有用 •列出目标模块大小工具size size命令可以列出目标文件每一段的大小以及总体的大小 •反汇编工具objdump objdump工具用于反编译二进制文件,也可以对对象文件进行反汇编,并查看机器代码,显示二进制文件信息 •打印目标代码工具stringsStrings打印工具可打印目标代码字符(至少4个字符),也可以使用选项“-n”设置字符串的最小长度 •GCC编译器简介•GCC是一个用于程序开发的自由编译器起初gcc是GNU C语言编译器的英文缩写,但是随着众多自由开发者的加入和GCC自身的发展,如今的GCC已经成了一个包含众多语言的编译器了,可以编译包括C、C++、Object C、Java、Fortran、Pascal等高级语言编写的程序。

      •gcc的优点•目前Linux下的默认使用的C语言编译器是GCC,它是GNU项目中符合ANSI C标准的编译系统,它不仅功能非常强大,结构也异常灵活其优点如下: 便于控制编译过程 与gdb调试工具结合使用 GCC提供灵活强大的代码优化功能 提供告警信息和扩展 •GCC的交叉编译平台•交叉编译,是指在一个平台上生成另一个平台上的可执行代码所谓的平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)一般而言,同一个体系结构可以运行不同的操作系统,同样,同一个操作系统也可以在不同的体系结构上运行 •交叉编译平台搭建 下载安装包 解压安装程序 添加系统路径 重新登录计算机 使用交叉工具安装操作 •GCC编译 •GCC编译器通过编译选项可以让程序员完美的控制整个编译过程,并将C、C++语言源程序编译成可执行文件 后缀名对应的语言种类后期可能进行的操作.cC语言源程序预处理、编译、汇编、链接.C/.cc/.cxxC++语言源程序预处理、编译、汇编、链接.mObjective-C语言源程序预处理、编译、汇编、链接.i预处理后的C文件编译、汇编、链接.ii预处理后的C++文件编译、汇编、链接.s/.S汇编语言源程序汇编、链接.o目标文件程序链接.a/.so编译后的库文件无.h预处理的所需文件无 •GCC编译器的主要格式为: gcc [选项] 要编译的文件 [选项] [目标文件]•gcc有大约100多个选项,主要包括总体选项、警告选项、出错选项、优化选项以及体系结构选项等 •GCC编译流程解析 预处理 编译 汇编 链接实例操作 •常用选项 选项对应选项的解释-X language指定输入文件的语言为language-E只对源文件进行预处理,不做编译、汇编及链接,GCC会忽略任何不需要预处理的输入文件-S只进行编译,不做汇编及链接,对于每个输入的非汇编语言文件,输出文件都是汇编语言文件.-c只进行汇编,不做链接,汇编成源文件的目标文件,缺省状态下生成.o文件,GCC忽略-c选项后面任何无法识别的输入文件-o file把输出的文件指定到file中,该选项可以输出汇编文件、目标文件以及可执行文件-v打印出编译器内部编译各个过程的命令行信息和编译器版本信息 •警告出错选项 选项对应选项的解释-fsyntax-only检查程序中的语法错误,但是不产生输出信息-w禁止所有警告信息-Wunused如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.-Wmain如果把main函数声明或定义成奇怪的类型,编译器就发出警告-Werror视警告为错误;出现任何警告即放弃编译.-Wredundant-decls如果在同一个可见域某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别-Wall允许gcc提供所有有用的报警信息-pedantic-error允许发出ANSI C标准所列出的全部信息 •优化选项 GCC可以对代码进行优化,它通过编译选项“-On”来控制优化配置,其中n是一个代表优化级别整数,n变化范围一般在0到3之间,n值越大,优化效果越好。

      •目录选项 “-I 目录”选项表示在头文件搜素路径中添加需要的目录 “-L 目录”的功能是在库文件的搜素路径中添加用户自定义的搜素的目录名 •GCC编译性能分析 •程序性能测试工具gprof gprof可以帮助用户找出应用程序中消耗CPU时间最多的函数,同时产生程序运行时的函数调用关系,从而帮助用户分析程序的运行流程有了函数的调用关系,就可以大大提高工作效率其格式如下: gprof [选项] 用户应用程序 gmon.out选项选项说明-b不再输出统计表格中的详细信息,仅显示简要信息-p只输出函数的调用图-i输出该统计总结信息-T以传统的BSD格式,打印输出信息-q仅输出函数的时间消耗列表-w width设置输出的宽度-e Name不输出函数Name及其子函数的调用图-f Name输出函数Name 及其子函数的调用图-z显示从未未使用过的函数信息-D忽略函数中未知的变量实例操作 •程序覆盖测试工具gcov • gcov是gnu/gcc工具库中的一个组件,简称为“程序覆盖测试工具”,用它对程序分析,可以让用户知道哪部分代码没有使用、哪部分代码执行效率最高以及哪部分代码占用cpu的时间最多。

      从而改善程序代码,让程序执行的更快、更有效其格式如下: gcov [选项][用户程序] 选项选项含义-b表示显示对分支的测试信息-h显示gcov的帮助信息-v显示gcov的版本信息-n不创建gcov的输出信息-f输出每个函数的使用信息实例操作 • GCC编译使用实例 试编写score.c、Max.c、Min.c和average.c程序,主要实现如下功能:从键盘上读取10位同学的成绩信息,使用三个子函数分别求出最高分、最低分和平均分在程序编写完毕后使用gcc工具编译score.c,并使用gprof程序程序性能测试工具分析各函数的使用状况 实例操作 •makefile工程管理器 •工程管理器,顾名思义就是管理含有多个文件的工程工具 GNU make在Linux编程中起着十分重要的作用使用GNU 的make工具能够比较容易的构建一个属于用户自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接甚至到最后的执行,通过makefile文件可以清晰的描述源文件之间的相互关系并自动维护编译工作;其次,使用make工具能够很方便的描述系统编译程序的内容、顺序和方式以及如何自动管理软件的编译。

      •Makefile文件有编译、连接的规则和语法,也有自己的书写格式、关键字、函数以及语法结构 通常一个Makefile的结构如下: TARGET:Dependency file COMMAND TARGET:Dependency file COMMAND …… TARGET:Dependency file COMMAND 实例编写 •变量基础 在Makefile中的变量,它不仅可以代表一个文本字符串,而且可以用来代表文件名、编译选项、程序运行的选项参数、搜索源文件的目录以及编译输出的目录在Makefile的目标、依赖、命令中任意引用变量的地方,在执行make命令后,所有变量都会被变量定义的值所取代 变量的命名可以包含字符、数字、下划线,但绝对不可以使用含有“:”、“#”、“=”或是空字符(空格、回车等)的字符 •变量定义及使用 Makefile文件的变量定义有两种方式,一种是递归展开定义法,另一种是直接展开定义法两者的区别在于定义的方式和展开的时机不同两者相同点在于,在变量定义时斗需要赋予初值,当使用这些变量时,都需要在变量名前加“$”符号。

      使用变量名时最好使用“()” 将变量括起来其次,如果要使用真是的“$”符号,那么需要用“$$”来代替 •递归展开定义法 这种变量定义法是通过“=”或者使用指示符“define”来定义变量其格式如下所示: Var=var 其中,Var是变量名,var是赋予变量Var的值 对使用递归展开定义的变量,其引用的地方是严格的文本替换过程变量将会原模原样的被字符串替代如果此变量定义中存在对其他变量的引用,那么被引用的变量会在它被展开的同时被展开 实例操作 •直接展开定义法 为避免“递归展开法”定义变量的不方便,在Makefile中可以使用另外一种变量定义的方式,这种方式的变量使用“:=”定义变量其格式如下: Var :=var 其中,Var是变量名,var是赋予变量Var的值 同递归定义法不同,直接展开定义法,在调用变量时,变量值中对另外变量的引用在定义时被展开所以在变量被定义以后就是一个实际所需要定义的文本串,不再包含任何对其它变量的引用其次,需要注意的是,使用直接定义法定义变量时,就完成了对所引用的变量的展开,因此它不能实现对其后定义变量的引用实例编写 •变量分类 Makefile中变量分为自定义变量、预定义变量、自动变量和环境变量•预定义变量。

      包含常见的编译器、汇编器的名称及其编译选项 变量含义AR库文件维护程序的名称,默认值为arAS汇编程序的名称,默认值为asCCC编译器的名称CPPC预编译器的名称,默认值为$(CC) –ECXXC++编译器的名称,默认值为g++PCPascal编译器的名称FCFORTRAN编译器的名称,默认值为f77RM文件删除程序的名称,默认值为rm –fARFLAGS库文件维护程序的选项,无默认值ASFLAGS汇编程序的选项,无默认值CFLAGSC编译器的选项,无默认值CPPFLAGSC预编译的选项,无默认值CXXFLAGSC++编译器的选项,无默认值FFLAGSFORTRAN编译器的选项,无默认值 •自动变量•为了简化Makefile的编写,Makefile引入自动变量,自动变量可以代表编译语句中出现的目标文件和依赖文件等使用自动变量可以为Makefile的编写提供便捷自动变量含义$@表示当前规则中的完整目标文件名$?新修改过的依赖文件列表,即所有时间戳比目标文件晚的依赖文件,并以空格分开$*不包含扩展名的目标文件名$<当前规则中的第一个依赖文件名$%当目标文件为库文件时,该变量为库文件名$^当前规则中的所有文件列表$+所有依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件实例操作 •实例: 将下面的Makefile程序使用预定义变量、自动变量以及自定义变量改写。

      wth:wth.o sun.o wang.o gcc wth.o sun.o wang –o wth wth.o:wth.c head1.h gcc –wall –O –g –c wth.c –o wth.o sun.o:sun.c head2.h gcc –wall –O –g–c sun.c –o sun.o wang.o:wang.c gcc –wall –O –g–c sun.c –o sun.o •Makefile常用函数 •字符替换函数subst $ ( subst A ,B, text) 此函数的作用是将文本“text”中的每一个“A”字符用字符“B”替换•模式替换函数patsubst 模式替换函数patsubst的格式为: $(patsubst A, B, text) 此函数的作用是将文本“text”中符合格式为“A”的字符,用格式“B”替换,在格式“A”“B”中可使用通配符参数“A”中经常使用模式通配符“%”来代表一个单词中的若干字符此函数经常用于文件后缀名的转化,同上文提到的“变量替换引用”有异曲同工之处 •空格压缩函数strip 空格压缩函数strip的格式如下: $(strip text) 此函数的作用表示将“text”中的多余空格进行压缩,(包括前导或者结尾的空格字符)并将多个空格变为单个空格。

      •字符串查找函数findstring 字符串查找函数findstring的格式如下: $(findstring A, text) 此函数的作用表示在“text”中查找字符串“A”,如果找到则其返回值为“A”,否则为空 •字符排序函数sort 字符排序函数sort的格式如下:$(sort text)此函数的作用是将“text”中的字按字母顺序排序,并去掉其中重复的单词其输出由单个空格隔开的单词列表如果第一个字母相同则比较第二个,依次类推•取单词函数word 取单词函数word的格式如下: $(word N, text) 此函数的作用是将“text”中的第N个单词取出,并返回这个单词如果不存在第N个单词,则返回值为空 •取单词串函数wordlist 取单词串函数wordlist的格式如下: $(wordlist N1, N2, text) 此函数的作用表示取出“text”中第N1个到第N2个单词,其中N1,N2表示表示单词在“text”的位置数字在操作过程中,如果N1大于N2,则返回值为空;如果N1比“text”中的单词数大时,返回值同样为空;如果N1小于“text”中单词数,但是N2大于“text”中单词数,那么将返回从第N1个到“text”结束时的单词串。

      •统计单词数函数words 统计单词数函数words的格式如下: $(words text) 此函数表示统计text中的单词数目•过滤函数 filter 过滤函数filter的格式如下: $(filter A…,text) 此命令表示将在text中寻找由空格隔开并且匹配格式为“A”字,去除不符合格式为“A”的字符 •取目录函数dir 取目录函数dir的格式为: $(dir text) 此命令表示取出text中每个文件的路径部分文件名路径部分包括从文件首字符到文件最后一个斜杠之前的一切字符,如果文件前没有目录斜杠,则默认表示这个文件是当前目录下文件,并输出为“./”•取文件名函数notdir 取文件名函数notdir的格式为: $(notdir text) 此命令表示取出text中的每个文件名文件名即除了路径部分的一切字符 •添加文件后缀函数addsuffix 添加文件后缀函数addsuffix格式如下: $(addsuffix A, text) 此函数的作用表示将text中每个文件名后添加后缀“A”•添加文件前缀函数addprefix 添加文件后缀函数addprefix格式如下: $(addprefix A, text) 此函数的作用表示将text中每个文件名后添加前缀“A” •判断函数 判断函数if的格式如下: $(if A, B ,C) 此函数的作用是判断A,对变量A展开后,如果“A”的结果非空,则条件为真,同时将B作为函数的表达式;如果条件为假,则将C作为函数的表达式。

      •shell函数 Shell函数的格式如下: $(shell shell-command) 此函数的作用是在Makefile中执行“shell-command”命令,并将它的执行结果返回Makefile •Makefile规则语法 •显式规则 显式规则描述了如何将“依赖文件”转变为“目标文件”的方法,书写这种规则的Makefile,需要明确地给出目标文件、目标依赖文件的列表以及更新目标文件所需要的命令 •存在weed.c,wth.c以及编译文件Makefile,如果使用Makefile中代码如下,能否正常编译出example可执行文件?为什么?Makefile源程序:# File Makefilevar:=$(shell ls) #命令行1obj:=$(patsubst %.c,%.o,$(var)) #命令行2CFLAGS:=-O -g -cCC:=gccexample:$(wordlist 1,2,$(obj)) $(CC) $^ -o $@ $(word 1,$(obj)):$(word 1,$(var)) $(CC) $(CFLAGS) $^ -o $@ $(word 2,$(obj)):$(word 2,$(var)) $(CC) $(CFLAGS) $^ -o $@ •隐式规则•隐式规则不同于传统的显式规则。

      当用户使用隐式规则时,不需要详细的指定编译的具体细节,而只需把文件列出即可它可以根据要产生的可执行文件和其依赖文件(典型的是根据文件名的后缀)自动推导出其依赖文件是如何使用默认命令编写规则的•常见的隐式规则列表 语言后缀变化使用规则C编译:将file .c变为file.o$(CC) $(CPPFLAGS) $(CFLAGS) –c file.c –o file.oC++编译:将file.cc变为file.o$(CXX) $(CPPFLAGS) –c file.cc –o file.oPascal编译:将file.p变为file.o$(CP) $(PFLAGS) –c file.p –o file.oFortran编译:将file.r变为file.o$(CP) $(FFLAGS) –c file.r –o file.o •静态模式规则 模式规则是用来定义具有相同处理规则的多个文件,它类似于显式规则,但同显式规则又有所差距在模式规则中,目标的定义需要有“%”字符表示对文件名的匹配,返回值为一个或多个任意字符在依赖文件中同样可以使用“%”,只是依赖文件中的“%”的取值,取决于其具体目标 •Makefile使用实例 •以下是一复杂工程中截取的一小段makefile试分析该Makefile中各代码的功能:#Makefile copyright 1.0 #Make by bistu wthTOPDIR= $(shell pwd ) #命令行1OBJ=lib.o target.o nm.o display.o #命令行2CROSS_COMPILE = $(TOPDIR)/arm/bin/arm-Linux- #命令行3CFLAGS= -Wall -O -g -c #命令行4DLibs=$(TOPDIR)/lib/ #命令行5Dfiles=$(TOPDIR)/otherfile/ #命令行6CC = $(CROSS_COMPILE)gcc #命令行7CPP=$(CC) –E #命令行8 AS = $(CROSS_COMPILE)as #命令行9LD = $(CROSS_COMPILE)ld #命令行10Config:$(OBJ) #命令行11 $(CC) –L DLibs $^ -o $@ #命令行12 $(word 1,$(OBJ)): $(word 1,$(TOPDIR)/lib) #命令行13 $(CC) $< –I $(Dfiles) –CFLAGS –o $@ #命令行14 $(word 4,$(OBJ)): $(patsubst, %.o, %.s,$(word 4,$(OBJ))) #命令行15 $(AS) –c $^ -o $@ #命令行16$(patsubst %.o, %.s,$(word 4,$(OBJ))): $(patsubst %.s, %.i,$(word 4,$(OBJ))) #命令行17$(CC) –S $^ -o $@ #命令行18$(addsuffix .i, $(findstring display, $(word 4,$(OBJ)))): $(addsuffix .c, $ findstring display $(word 4,$(OBJ)))) #命令行19 $(CPP) $^ -o $@ #命令行20%.o : %.c #命令行21 $(CC) –I $(Dfiles) $(CFLAG) –c $< $@ #命令行22.PHONY : cleanobj cleani cleans #命令行23cleanobj : #命令行24 rm -f $(OBJ) #命令行25cleani : #命令行26 rm -f *.i #命令行27 cleans : #命令行28 rm -f *.s #命令行29 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.