美文网首页
GCC程序编译

GCC程序编译

作者: 静等凌风 | 来源:发表于2016-01-25 13:31 被阅读0次

1.1实验目的

n熟练掌握Linux GCC的使用操作方法

1.2实验内容

n综合运用Linux GCC的技巧操作。

1.3步骤及现象

n利用GCC编译器编译程序

1、实验要求:

编写一个应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项,了解这些选项的作用。

2、实验器材:

软件:

安装了ubuntu的VMware虚拟机。

硬件:

PC机一台。

3、背景知识:

ügcc的概念:

GCC(GNU CompilerCollecti on,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑MacOSX操作系统的标准编译器。GCC原名为GNU C语言编译器,因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理For tr an、Pascal、Obj ecti v e-C、Jav a,以及Ada与其他语言。我们使用的gcc命令主要是用于处理c语言程序。

ügcc的执行过程:

虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译( Compilation)、汇编( Assembly)和链接( Linki ng)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含( i

ncl ude)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的库中连到合适的地方。以上这些过程是gcc内部实现的机制,实际使用中,上述过程可以又通过gcc的选项实现,具体方法请通过实验体会。

4、实验步骤

ü先用vim编辑hello.c文件,内容如图所示:

图1vim编写hello.c

ügcc命令的一般格式为:gcc[选项]要编译的文件[选项][目标文件]。

下面使用命令gcchello.c–ohello,编译hello.c,并生成可执行文件hello,

图2直接生成可执行文件hello

注意:上面的命令将.c文件生成了可执行文件,实际上是将预处理、编译、汇编、连接一步完成,下面我们将介绍四个流程分别做了什么工作。

ü使用–E选项,执行预处理工作。使用命令gcc–E hello.c–o hello.i对hello.c进行预处理,生成文件hello.i,如图所示:

图3使用-E选项

使用命令cat

hello.i查看hello.i文件的内容,如图5-4所示,可以看到头文件

stdio.h中包含的内容替换掉了原先代码中的#include。

图4查看文件hello.i内容

ü使用–S选项,执行编译处理工作。使用命令gcc–S hello.i–o hello.s对hello.i进行编译,生成汇编文件hello.s,如图所示:

图5使用-S选项

使用命令cat

hello.s查看hello.s文件的内容,如图5-6所示,可以看到原来的

c语言代码已被转化为汇编代码。

图6查看文件hello.s内容

ü使用–c选项,执行编译工作。使用命令gcc–chello.s–o

hello.o对hello.s进行汇编,生成目标文件hello.o,如图所示:

图7执行使用-c选项

ü使用命令gcc hello.o–o hello将hello.o链接库,生成可执行文件hello,如图

所示,以上四个步骤就对应了gcc执行过程的四个基本步骤,下面我们来看看gcc其他一些重要的选项。

图8连接生成可执行文件

ü使用–static选项,静态链接库。使用命令gcchello.c–ohello和gcchello.c–static–ohello1分别生成两个可执行文件hello和hello1。头一个文件hello是不加-static选项,默认是链接动态库生成的,如图所示,试比较链接动态库生成的文件hello和链接静态库生成的文件hello1的大小。

图9使用-static选项

可以看到静态链接库的可执行文件hello1要比动态链接库的文件hello大很多,他们的执行效果是一样的。

注意:要使动态链接库的可执行文件能够在机器上运行,必须保证系统中安装有相关的动态链接库,这些库一般在/lib目录下。

ü使用–g选项,在可执行程序中包含标准调试信息。使用命令gcc–ghello.c–o

hello2生成包含调试信息的文件hello2,如图所示,带有调试信息的可执行文件可以使用gdb调试器进行调试,gdb的具体用法将在下节讨论。

10使用-g选项

ü使用–D选项,在编译时进行宏定义。使用命令gcc–DLINUXhello.c–o

hello3生成定义了宏LINUX的的可执行文件hello3,如图所示,将hello3和原可执行文件hello进行比较。

图11修改源码,注释第三行代码

图12使用-D选项

ü使用–O2选项,完成程序的优化工作。为了能够看出优化效果,首先在源代码中添加如图所示内容

图13优化测试代码

使用命令rm

hello? hello–f,删除之前生成的文件,使用命令gcc–O2 hello.c–o hello1生成优化后的可执行文件hello1,使用命令gcc hello.c–o

hello生成未经优化的可执行文件hello。如图5-13所示,将hello1和未优化过的可执行文件hello进行比较。

图14使用-O2选项

提示:事实上gcc有四个优化等级,分别对应选项-O0、-O1、-O2和-O3,其中-O0代表不优化,这个是缺省值,-O1到-O3优化等级逐步提高。另外还有个特殊的优化选项-Os,它通常被称为是优化等级为2.5的优化选项,是在-O2的基础上对代码尺寸进行了进一步优化。另外,为了更好的验证优化的效果,可以使用time命令,如time./hello,可以测试当前目录下可执行文件hello的执行时间。由于实验代码过于简单,所以用time测试基本看不出差别,大家可以自己编写复杂耗时的程序用于这个实验。注意:虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。

因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。

相关文章

  • GCC程序编译

    1.1实验目的 n熟练掌握Linux GCC的使用操作方法 1.2实验内容 n综合运用Linux GCC的技巧操作...

  • 线程

    编译带线程的程序时 : gcc *.c -lpthread

  • gcc

    gcc -Xlinker -v 将c程序静态编译 gcc -static -o c_static.out main.c

  • Linux 编译和链接程序

    Linux 编译和链接程序 使用编译器gcc g++Linux可执行程序编译步骤1、编译c/cpp文件 ->.o2...

  • 程序的运行过程

    GCC只是完成编译工作的驱动程序,它会根据编译流程分别调用预处理程序、编译程序、汇编程序、链接程序来完成具体工作。...

  • 2018-10-21

    树莓派GDB调试程序 编译程序 gcc -g test.c -o test -lwiringPi通过上述编译指令编...

  • gcc常用操作

    gcc -c filename.c #生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。 gcc...

  • 升级gcc

    很多时候 Linux 系统自带的 gcc 版本过低导致 C++11 的程序无法编译,升级 gcc 到6.1.0。 ...

  • linux CentOS8安装redis

    安装编译工具 安装编译工具# yum install -y gcc gcc-c++检查gcc的版本# gcc --...

  • Makefile快速入门

    编译概述 编译基础: 使用GCC编译程序时可以分为4个阶段: (1)预处理(pre-processing)-E.c...

网友评论

      本文标题:GCC程序编译

      本文链接:https://www.haomeiwen.com/subject/evtdkttx.html