首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GCC编译器使用

一、GCC简介通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序,它是Linux平台编译器的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用,是因为它能支持各种不同的目标体系结构。例如,它既支持基于宿主的开发(简单讲就是要为某平台编译程序,就在该平台上编译),也支持交叉编译(即在A平台上编译的程序是供平台B使用的)。目前,GCC支持的体系结构有四十余种,常见的有X86系列、Arm、PowerPC等。同时,GCC还能运行在不同的操作系统上,如Linux、Solaris、Windows等。
除了上面讲的之外,GCC除了支持C语言,还支持多种其他语言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal、go等。
GCC的安装:
Ubuntu等基于Debian发行版Linux可以使用如下命令安装:
apt -get install gcc
Fedora等基于RPM发行版Linux可以使用如下命令安装:
yum install gcc
使用如下命令查看gcc的版本:
gcc --version

二、程序的编译过程对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所示:

从功能上分,预处理、编译、汇编是三个不同的阶段,但GCC的实际操作上,它可以把这三个步骤合并为一个步骤来执行。下面以C语言为例来谈一下不同阶段的输入和输出情况。
GCC编译器的基本选项如下表:
                               
类型说明
-E预处理后即停止,不进行编译、汇编及连接
-S编译后即停止,不进行汇编及连接
-c编译或汇编源文件,但不进行连接
-o file指定输出文件file
         
在预处理阶段,输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件不可,可以利用下面的示例命令:
gcc -E  test.c -o test.i
在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示:
gcc -S test.i -o test.s
在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:
gcc -c test.s -o test.o
最后,在连接阶段将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:
gcc test.o -o test
运行如下:

可以通过:cat -n [filename]命令查看每一个阶段的文件内容
上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。
三、警告选项GCC提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告
GCC的编译器警告选项如下表:
                       
类型说明
-Wall启用所有警告信息
-Werror在发生警告时取消编译操作,即将警告看作是错误
-w禁用所有警告信息
         
实例1:给出一段代码,使用gcc进行编译,同时开启警告信息(test1.c)
#include<stdio.h>int main(){   int i;   for(i = 0; i <= 3; i++)     printf("hello gcc!\n");   //return 0;}
使用-Wall开启警告:

从上面可以看出,GCC给出了警告信息,意思是main函数的返回值被声明为int,但是没有返回值,GCC并不是简单的发出警告,会中断整个编译过程
如果不想看到警告信息,可以使用-w来禁止所有的警告。
此外,GCC还提供了许多以-W开头的选项,允许用户指定输出某个特定的警告,例如:
  • -Wcomment:出现注释嵌套时发出警告。
  • -Wconversion:如果程序中存在隐式类型转换,则发出警告。
  • -Wformat:检查printf和scanf等格式化输入输出函数的格式字符串和参数类型的匹配情况,如果发现不匹配则发出警告。
  • -Winline:如果函数不能被内联,则发出警告。
  • -Wlong-long:如果使用了long long型数据,则发出警告。
  • -Wmain:如果main函数的返回类型不是int型,或者调用main函数时使用的参数数目不正确,则发出警告。
  • -Wmissing-declarations:如果定义了全局函数,但却没有在头文件中声明,则发出警告。
  • -Wparentheses:在某些情况下,如果忽略掉了括号,则会发出警告。
  • -Wreturn-type:如果函数定义了返回类型,而默认类型是int型,编译器会发出警告。
  • -Wuninitialized:如果使用的自动变量没有被初始化,则发出警告。
  • -Wundef:如果在#if宏中使用了未定义的变量做判断,则发出警告。
  • -Wunused:如果声明的变量或static型函数没有使用,则发出警告。
实例2:给出一段代码,使用gcc进行编译,同时开启警告信息(test2.c)
#include<stdio.h>int main( ){    int a = 1;    int b = 0;    int c = 1;    if(a && b || c)    {        ;    }    if(a == 1)        if(b == 1)            printf("b = 1\n");    else        printf("b != 1\n");    return 0;}
使用-Wparentheses开启警告:
继承事业,薪火相传
返回列表