GCC编译器详解

当我们开发Linux应用程序时,绝大多数情况都在使用C语言。利用C语言开发离不开C语言编译器。GCC(GNU C Compiler)是目前Linux下最常用的C语言编译器。GCC是GNU推出的功能强大、性能优越的多平台编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译使用C、C++、Objective-C等语言编写的程序;可以在多种硬件平台上编译出可执行程序的超级编译器,而且较一般的编译器执行效率高。

        1、GCC的基本用法

gcc  [options] filenames

options :编译器所需要的编译选项,为可选参数,可以没有;
filenames :要编译的文件名。
以简单的hello world程序为例,新建hello.c文件如下
#include <stdio.h>
int main(void)
{
        printf("Hello World!!\n");
        return 0;
}
打开Linux终端,通过gcc hello.c 编译后生成a.out,运行后输出Hello World!!;如下
        在上面的编译过程中,GCC编译器将我们编写的hello.c源文件编译成a.out可执行文件,其实整个过程可以细分为四个阶段:预处理、编译、汇编、链接,我们可以通过制定编译选项来查看产生的中间文件,具体步骤如下
        1、hello.c经预处理后产生hello.i,通过加入-E选项获得:gcc -E hello.c -o hello.i
        2、hello.i经编译后产生汇编文件hello.s,通过加入-S选项获得:gcc -S hello.i -o hello.s
3、hello.s经汇编后产生hello.o二进制文件,通过加入-c选项获得 :gcc -c hello.s -o hello.o
4、最后经过链接后生成hello可执行文件hello:gcc hello.o -o hello   上图:
GCC通过文件的后缀来区分输入文件的类型,常见的类型有
  • .c为后缀的文件:C语言源代码文件
  • .a为后缀的文件:由目标文件构成的库文件
  • .C、.cc、.cxx为后缀的文件:C++源代码文件
  • .h为后缀的文件:头文件
  • .o为后缀的文件:编译后的目标文件
  • .s为后缀的文件:汇编文件

2、常用的GCC选项

掌握GCC的使用方法,最重要的是掌握GCC的编译选项,GCC编译器的编译选项大约有100多个,大多数我们都用不到,常用的几个如下:
1)-o output_filename:确定输出文件的名称为output_filename,如果不给出这个选项,GCC就给出预设的可执行文件a.out; 正如上面我们第一次编译hello.c的时候没有加入-o选项,生成了a.out可执行文件。
2)-O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文 件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些。
3)-O2:比-O更好的优化编译、链接,但是整个编译、链接的过程会更慢。
4)-c:不链接。编译器只是由输入的.c等源文件编译生成.o为后缀的中间文件。
5)-g:产生调试工具(GDB)所需要的调试信息,要想对编译出的程序进行调试,就必须加入-g选项。
6)-I dirname:将dirname所指出的目录作为编译器要寻找头文件的标准路径
C语言中包含头文件有两种情况:
#include <A.h>  
#include "B.h"
对于<>gcc在系统预设的头文件目录(/usr/include)中搜寻相应的文件;而对于””gcc在当前目录中搜寻头文件。-I
项的作用是告诉
gcc,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。
7)-Wall:生成所有警告信息; -w:不生成任何警告信息
编译错误与编译警告都是我们的程序设计中经常遇到的问题. 编译错误一般是代码中出现语法错误,程序无法编译执行,必须修改. 编译警告是编译器发现程序中不
合理的地方(比如类型不匹配),
建议最好修改,但不修改也可以编译执行。
8)-DMACRO定义 MACRO 宏,等效于在程序中使用#define MACRO





  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值