Linux—GCC编译器概述

一.gcc简介

因为在Linux下开发应用程序时,基本使用的都是C语言,所以就要求我们至少熟练掌握一种C编译器。编译器可以把我们利用高级语言编写的源代码转换成为计算机能够直接执行的二进制代码,因为CPU是不能够理解main、int、double等这些C语言的关键词,CPU只能识别和执行由0、1俩个数码构成的二进制代码。
Linux中最常用的编辑器就是gcc(GUN Compiler Collection),它是GUN项目中符合ANSI C标志的编译器,能够编译C、C++、Java、Fortran、Pascal和Ada等语言编写的程序。gcc不仅功能强大、简单灵活,而且它还能支持各种不同的硬件平台,在Linux下的嵌入式开发中也有广泛的应用。

二.程序的编译过程

使用gcc进行编译程序时,编译过程可以分为四步:

  • 预处理
  • 编译
  • 汇编
  • 链接

我们以test.c文件的编译为例
下面对这四步操作进行详细的介绍:

1.预处理

在预处理阶段,gcc要处理C文件中的预处理命令,也就是我们熟悉的一些指令:

#define
#ifndef
#include

在这个阶段会生成中间文件test.i,但在实际工作中不会专门生成这种文件,如果必须要生成这种文件,可以用下面的gcc命令:

gcc -E test.c -o test.i

2.编译

在编译阶段,输入的是预处理阶段生成的test.i文件,编译后生成汇编语言文件test.s,这个阶段对应的gcc命令为:

gcc -S -test.i -o test.s

3.汇编

在汇编阶段,输入的是编译阶段生成的test.s文件,经过转换后会生成二进制机器文件test.o,但此时的二进制机器文件还不是计算机可以直接执行的可执行文件,这个阶段对应的gcc命令为:

gcc -c test.s -o test.o

4.链接

在链接阶段,输入的是汇编阶段产生的二进制机器代码test.o链接阶段将把这个二进制机器文件与其他的机器代码文件和库文件汇集成一个可执行的二进制代码文件,这一步骤可以用如下gcc命令完成:

gcc test.o -o test

这样就完成了一次完整的gcc编译过程,最后生成的test是可以被计算机直接执行的可执行二进制文件。

5.总结

以上这四步操作可以用一条命令直接代替:

gcc test.c -o test

当有多个源文件时,可以将这些源文件生成一个可执行文件,比如要把tset1.c、test2.c、test3.c这三个源文件生成一个可执行文件,可以使用如示gcc命令实现:

gcc -o test test1.c test2.c test3.c

如果要执行程序,只需要在命令行中输入如下内容即可:

./test

三.gcc基本用法

在使用gcc编译器的时候,我们必须给出一系列必要的选项和文件名,这样gcc才能准确的执行相关操作,而gcc的选项有100多个,其中很多参数基本不会用到,下面介绍一些基本常用的用法。
gcc最基本的用法模板如下所示,其中options就是编译器所需要的参数,也可以理解为gcc的操作,而filename则是相关文件的名称,代表操作对象:

gcc [ options ] [ filename ]

下面的内容均为options中的参数:

1.-c

意为只编译,不链接成可执行文件,相当于只进行到编译阶段,只生成二进制机器代码test.o,通常用于编译不包含主程序的子程序文件。

2.-o

意为生成可执行的二进制文件test,要注意的是输出文件的名称不能与源文件相同,可以不说明输出文件的名称,这时候gcc会默认将输出的可执行文件命名为a.out,如果后续再编译其他的文件,这个a.out文件会被新输出的可执行文件所覆盖,所以我们还是尽量在使用-o时加上输出文件名称。

3.-g

-g是产生调试器gdb所必须的符号信息,要想对源码进行调试,就必须在编译程序时加入这个选项。

4.-O(大写)

意为对程序进行优化编译、链接,采用这个选项时,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率较高,但随之会降低编译、链接的速度。

5.-O2

和-O的作用一样,都是优化,但-O2的优化作用更强,所以速度降低的程度也就越大。

6.-Wall

意为输出所有警告信息,在gcc编译过程中,如果gcc认为在某些地方发生了错误,就会提出一些相应的警告和提示信息。

7.-Idirname

将名为dirname的目录加入到程序的头文件目录列表中,它是在预处理阶段使用的选项,I意为include。

8.-Werror

意为将所有的警告都作为错误提出,这样有利于引起程序员高度重视。

四.关于优化

关于优化,优化确实能够给程序带来更好的执行性能,但在如下的一些场合中应该避免优化代码:

  • 程序开发:在程序开发时,优化等级越高,消耗在编译上的时间就越多,所以开发时尽量不要使用优化,在软件发行或开发结束的时候,可以考虑对最终生成的代码进行优化。
  • 资源受限:一般优化会增加可执行代码的体积,正所谓:地主家都没余粮了!所以我们还是尽量减少资源的使用吧。
  • 跟踪调试:在代码进行优化时,可能会删改某些代码,或者为了取地更佳的性能而进行重组,这种情况会使跟踪和调试变得异常困难。
发布了62 篇原创文章 · 获赞 188 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43743762/article/details/100812197