



全文预览已结束
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GNU 编译器工具链 来源: ChinaUnix 博客日期: 2006.12.04 22:12(共有条评论) 我要评论 GNUGNUGNUGNU 编译器工具链编译器工具链 简介简介 GNU 编译器集合(也就是所谓的 GCC)是由高级语言源码来构建二进制文件的编译器以及实用程 序的集合。GCC 不仅是 GNU/Linux 上的标准编译器,而且他 也是嵌入式系统开发的标准编译器。这是因为 GCC 支持各种不同的目标架构。例如,我们在 这里所用的将专注于基于主机的开发(为我们编译所用的平台构建软 件) , 但是如果我们是交叉编译 (为一个不同的目标构建) , GCC 提供了40种不同的结构体系。 其中包括 X86,RS6000,Arm,PowerPC 以及 其他的许多。GCC 也可以用在40多种不同的主机系统上(如 Linux,Solaris,Windows) 。 GCC 除 了 标 准 C , 还 支 持 许 多 其 他 的 程 序 语 言 。 我 们 可 以 使 用 GCC 来 编 译 C+,Ada,Java,Objective-C,FORTRAN 等。 在这里我们会了解一下 GCC 的基本特征以及一些高级的主题(包括优化) 。我们也会了解一 些 GCC 中对于程序构造有用的相关工具。 编译简介编译简介 GNU 编译器在构建一个目标的过程中包含几个不同的步骤。 这些步骤可以分为四步: 预处理, 编译,汇编以及链接。 预处理,编译以及链接通常情况下包含在一个步骤之中,但是在这里为了演示 GCC 的功能, 我们要进行单独的展示。 在 预处理步骤, GCC 将会使用所包含的头文件(.h)来对源文件(.c)进行预处理.在这一步,一些指令 将会是行解释,如#ifdef,#include, #define 等.处理的结果是一个中间文件。通常这个文件根本不是在外问生成的,但是我们了为 完整在这里进行展示。经过预处理的源文件可以在编译步骤进 行汇编(.s).经过汇编的文件将会在汇编阶段转换为机器指令,结果为目标文件(.o)。最后,机 器码将会被链接到一起生成一个可执行的二进制文件。 编译的几个阶段如下表所示: 阶段输入输出GCC 例子 预处理*.c*.igcc -E test.c -o test.i 编译*.i*.sgcc -S test.i -o test.s 汇编*.s*.ogcc -c test.s -o test.o 链接*.o*gcc test.o -o test 这些只是初步的用法。现在我们将会深入 GCC 来了解他的各种用法。我们首先要来了解一下 演示 GCC 用法的各种模式,然后我们会探讨 GCC 最常用的一些选项。这包括调试选项,打 开各种警告以及优化。然后我们会了解一些与 GCC 相关的各种 GCC 工具。 GCCGCCGCCGCC 模式(编译,编译与链接)模式(编译,编译与链接) 作为开端的最简单的一个例子就是将一个 C 源文件编译成为一个可执行文件。 在这个例子中, 所需要的整个源码包含在一个文件中,所以我们使用下面的 GCC 命令: $ gcc test.c -o test 在这里我们编译 test.c 文件并且生成一个名为 test 的可执行言论。 如果在这里我们仅是希望生 成这个源码的目标文件,我们可以使用-c 选项,如下: $ gcc -c test.c 默认情况下将会生成名为 test.o 的目标文件。但是在这里我们希望生成的目标文件名为 newtest.o,我们可以用下面的命令: $ gcc -c test.c -o newtest.o 我们将要开发的大多数程序都会包含不只一个文件。GCC 可以很容易的在命令行处理这种情 况: $ gcc -o image first.c second.c third.c 在这里我们编译三个源文件并且将他们链接到名为 image 的可执行文件。 一些有用的选项 在大多数情况下,我们会把我们的头文件保存在一个与我们的源码文件目录不同的目录内。 假设这样一个例子,我们的源代码保存在一个名为./src 的子目录内,而我们的头文件保存在 同级目录下的./inc 目录中。我们可以告诉 GCC 使用我们提供到的头文件: $ gcc test.c -I./inc -o test 我们可以使用多个-I 选项来指定多个子目录: $ gcc test.c -I./inc -I ././inc2 -o test 在这里我们指定另一个名为 inc2的子目录。 对于软件的配置我们可以在编译行指定符号常量。 例如,我们可在我们的头文件或是源码中定义如下的一个符号常量: #define TEST_CONFIGURATION 我们可以很容易的使用-D 选项来在命令行定义一个类似的符号常量: $ gcc -DTEST_CONFIGURATION test.c -o test 在命令行进行指定的好处就在于我们并不需要修改源文件来改变他的行为。 最后一个有用的选项就是源与汇编点缀列表。考虑下面的一个命令行: $ gcc -c -g -Wa,-ahl,-L test.c 在这个命令行最有意思的就是-Wa 选项,他会将接下来的选项传递到汇编阶段,从而使用汇 编来点缀 C 源程序。 编译警告编译警告 在编译时如果检测到一个错误,GCC 就会退出编译过程,而警告信息就是显出了我们需要修 正的潜在的问题,尽管也许仍会着生一个可执行文件。GCC 提供了一个丰富的警告系统,但 是为了利用可以检测到的警告范围,我们必须打开这些选项。 GCC 最常用的用来检测警告信息就是-Wall 选项。这会打开一个指定类型的所有警告信息, 这由程序中最常遇到的问题组成。用法如下: $ gcc -Wall test.c -o test 在-Wall 选项中打开的警告选项如下: 选项用途 unused-function警告声明为静态但是却没有定义的函数 unused-label警告声明但是却没有使用的标签 unused-parameter警告没有使用的函数参数 unused-variable警告没有使用的声明的局部变量 unused-value警告计算但是却没有使用的值 format验证 printf 中的格式字符串等基于指定的格式字符串的可用参数 implict-int当声明没有指定类型时警告 implict-function-函数的使用先于函数的声明时警告 char-subscripts当使用字符作为数组的下标时警告 missing-braces当初始集合没有被包含时警告 parentheses如果()的省略引起误解时警告 return-type警告函数的默认声明为 int 或是缺少返回值 sequence-point代码元素可疑时警告 switch在 switch 语句中缺少默认值,警告可以在 switch 参数中指定的缺少情况 strict-aliasing对于变量转换使用严格的规则 unknown-pragmas警告#pragma 指令没有被识别 uninitilized警告使用的变量没有进行初始化(只在-O2优化级别时可用) -Wall 是-all-warnings 的同义。上表列出了在-Wall 允许的各种警告选项。 在这里我们要注意大多数的选项都会有一个相反的形式,所以我们可以禁止他们。例如,如 果我们希望打开-Wall 选项,但是却要禁止没有用到的警告集合,我们可以使用下面的命令: $ gcc -Wall -Wno-unused test.c -o test 下表列出在-Wall 中没有打开的一些有用的选项 选项用途 cast-align当一个指针进行转换并且需要的赋值增加时警告 sign-compare当一个有符号数与一个无符号数进行比较并产生一个不正确的值时警告 missing-prototypes如果一个全局函数没有函数原型声明而使用时警告 packed如果一个结构提供了打包属性而没有打包事件时警告 padded如果一个结构进填补赋值时警告 unreachable-code如果代码不会执行警告 inline如果一个标记为内联但却不能实现内联时警告 disabled-optimization当优化器不能执行指定的优化时警告 最后一个有用的警告选项是-Werror。这个选项指明当检测到错误时并不简单的显示错误,编 译器会将警告当作错误对待并退出编译过程。 这个选项对于生成高质量的代码是相当有用的。 调试选项调试选项 如果我们希望用一个符号链接调试器来调试我们的代码,我们可以指定 -g 选项来为 GDB 着 生调用信息。-g 选项可以指定一个参数来说明生成哪种格式。如果我们希望调试信息使用 dwarf-2 格式来生成调试信息,我们可以使用下面的命令: $ gcc -gdwarf-2 test.c -o test 其他的一些工具:其他的一些工具: 下面我们来看一些在我们的开发过程中有用的 GNU 工具。 首先,我们如何来知道可执行程序或是目标文件的大小?size 实用程序可以使我们知道文本 尺寸(指令条数)以及 data 和 bss 段。如下面的例子: $ size test.o textdatabssdechex filename 78925641049419 test.o 在 这里我们列出了目标文件 test.o 的文件大小。我们发现文本尺寸(指令和常量)是789字节, data 段是256字节,bss 段(初始时自动设置为0) 是4字节。如果我们要知道更为详细的内容,我们可以使用 objdump 实用程序。我们可以使用 -syms 参数来知道可执行程序或是目标文件的符号表,如下 面的例子: $ objdump -syms test.o 这会产生一个目标文件中可用符号列表,他们的类型(text,bss,data) ,长度,偏移量等内 容。我们也可以使用 disassemble 参数来反汇编程序,如下面的例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古诗登高赏析与解读:高二语文教案
- 我的周末初一语文作文12篇
- 农业行业农产品质量安全责任免责合同
- 时间想象课件
- 高中我的老师作文8篇
- 市场调研数据分析表格-新零售模式探索
- 梦想的色彩700字(11篇)
- 农业生产托管技术服务协议
- 课题2 化学实验与科学探究 第1课时 常见仪器和试剂取用 分层作业(解析版)人教版九年级化学上册
- 《新编商务应用文写作》第三章 习题参考答案
- 初中九年级(人教版)语文(上下册)课本全部(40篇)诗词文言文集合
- 医院关于开展整治重复医疗检查检验、违规收费问题工作实施方案的通知
- 中医高热护理常规
- 船舶用钢市场发展分析及行业投资战略研究报告2025-2028版
- 人员密集场所管理制度
- 单轨吊轨道安装安全技术措施
- 供应商黑名单管理制度
- 高端数控机床智能化控制系统研发项目可行性研究报告
- 农机安全知识课件
- 2025年河南郑州航空港发展投资集团有限公司招聘笔试参考题库含答案解析
- 钢结构车棚建设服务方案投标文件(技术方案)
评论
0/150
提交评论