Linux编程gcc编译器
Fedora中总包含最近版本的gcc编译器,gcc原名为GNU C Compiler。该编译器最开始时定位于C语言编译器,经过多年的发展GCC已经不仅仅能支持C语言;它现在还支持Ada语言、C++语言、Java语言、Objective C语言、Pascal语言和COBOL语言等。gcc也不再单只是GNU C Compiler的意思了,而是变成了GNU Compiler Collection也即是GNU编译器家族。
1.初识gcc
在安装Fedora Core 6时,如果选择安装开发工具包后,则gcc编译器就已经被
息,如图13-11所示。
图13-11 gcc版本信息
上述信息表示系统中没有到gcc的相关版本信息,那么可能在系统中没有安装该编译器。此时用户可以选择【应用程序】|【添加/删除软件】命令,在打开的【软件包管理者】对话框中选择开发工具包,安装gcc编译器。
2.gcc规则
gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,首先来介绍gcc编译器所遵循的部分约定规则。
●.c为后缀的文件,C语言源代码文件。
●.a为后缀的文件,是由目标文件构成的档案库文件。
●.C,.cc或.cxx 为后缀的文件,是C++源代码文件。
●.h为后缀的文件,是程序所包含的头文件。
●.i 为后缀的文件,是已经预处理过的C源代码文件。
●.ii为后缀的文件,是已经预处理过的C++源代码文件。
●.m为后缀的文件,是Objective-C源代码文件。
●.o为后缀的文件,是编译后的目标文件。
●.s为后缀的文件,是汇编语言源代码文件。
●.S为后缀的文件,是经过预编译的汇编语言源代码文件。
gcc编译器在执行时,会根据不同的后缀对该文件进行编译,那么gcc编译器的执行过程又是如何呢?
3.gcc的执行过程
使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要历经四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。这四个步骤是顺序执行的,执行顺序如图13-12所示:
图13-12 执行顺序图
命令gcc首先调用cpp预处理器进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1编译器进行编译,在这个阶段根据输入文件生成以.o为后缀的目标文件。
汇编过程是针对汇编语言的步骤,调用as汇编器进行工作。一般情况下,.S 为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。
当所有的目标文件都生成之后,gcc就调用ld连接器来完成最后的关键性工作,这个阶段就是连接。连接器搜索指定的函数库,到程序使用的函数,并将这些函数的目标模块与本程序的目标代码结合在一起。在连接阶段,所有的目标
文件被安排在可执行程序中的恰当的位置。同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
4.使用gcc
使用gcc编译C程序时,gcc命令的格式如下所示:
命令中其中options就是编译器所需要的参数,filenames是需要编译的相关文件名。在使用gcc编译器的时候,必须给出一系列必要的调用参数和文件名称。gcc编译器的调用参数大约有100多个,其中多数参数可能根本就用不到,这里只介绍几种其中最基本、最常用的参数。
●-c 使用该参数时对文件只进行编译,不连接成为可执行文件,编译器只
是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包
含主程序的子程序文件。
●-o output_filename 确定输出文件的名称为output_filename,同时这个名
称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文
件a.out。
●-g 产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码
进行调试,就必须加入这个选项。
●-O 优化选项,对程序进行优化编译、连接,使用这个选项后整个源代
码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行
效率可以提高。但是,编译、连接的速度就相应地要慢一些。
●-O2 比使用-O参数具有更好的优化编译、连接,当然整个编译、连接过
程会更慢。
●-Idirname 将dirname所指出的目录加入到程序头文件目录列表中,是在
预编译过程中使用的参数。
这里需要对-Idirname参数进行一下说明。首先,C程序中的头文件包含两种情况∶
(1)#include <stdio.h>
(2)#include "myinc.h"
使用尖括号的头文件,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件;而使用引号的头文件,cpp在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有到需要的文件,就到指定的dirname目录中去寻。在程序设计中,如果需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。
●-Ldirname 将dirname所指出的目录加入到程序函数档案库文件的目录列
表中,是在连接过程中使用的参数。在默认状态下,连接程序ld在系统
的预设路径中(如/usr/lib)寻所需要的档案库文件,该选项告诉连接程
序,先到-L指定的目录中去寻,然后到系统预设路径中寻,如果函
数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目
录。
-lname 在连接阶段,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为
“libm.a”的数学函数库。
假定有一个程序名为test.c的C语言源代码文件,要生成一个可执行文件,最
的可执行文件,对于稍为复杂的情况,比如有多个源代码文件、需要连接档案库或者有其他比较特别的要求,就要给定适当的调用选项参数。
linux下gcc编译的四个步骤如果需要将该test.c源代码文件,编译成一个其他名称的可执行文件可以使用
上述命令执行后,生成一个mytest可执行文件,用户可以在终端容器中输入该执行文件的名称即可执行该文件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论