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
本文地址:http://www.cnblogs.com/archimedes/p/linux-gcc.html,转载请注明源地址。
二、程序的编译过程
对于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 = ; i <= ; 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 = ;
int b = ;
int c = ;
if(a && b || c)
{
;
}
if(a == )
if(b == )
printf("b = 1\n");
else
printf("b != 1\n");
return ;
}
使用-Wparentheses开启警告:

四、优化选项
GCC具有优化代码的功能,主要的优化选项包括如下:
- -O0:不进行优化处理。
- -O或-O1:进行基本的优化,这些优化在大多数情况下都会使程序执行得更快。
- -O2:除了完成-O1级别的优化外,还要一些额外的调整工作,如处理器指令调度等,这是GNU发布软件的默认优化级别。√
- -O3:除了完成-O2级别的优化外,还进行循环的展开以及其他一些与处理器特性相关的优化工作。
- -Os:生成最小的可执行文件,主要用于在嵌入式领域。
一般来说,优化级别越高,生成可执行文件的运行速度也越快,但消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,到软件发行或开发结束的时候才考虑对最终生成的代码进行优化。
- -finline-functions:允许编译器将一些简单的函数在其调用处展开。
- -funswitch-loops:将循环体中值不改变的变量移到循环体外。
实例:给出一段代码,使用gcc进行编译,同时比较优化前后执行程序所花的时间(test3.c)
#include<stdio.h>
int main()
{
int i, j, x;
x = ;
for(i = ; i < ; i++) {
for(j = i; j > ; j--) {
x += j;
}
}
return ;
}
运行后的结果如下:

可以看到,优化的效果十分的显著
GCC编译器使用的更多相关文章
- 在CentOS 7.2下升级gcc编译器的版本
默认情况下,CentOS 7.2预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编 ...
- C语言的编译过程、安装gcc编译器以及设置环境变量
以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1. ...
- 利用GCC编译器生成动态链接库和静态链接库
转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...
- GCC编译器编译链接
在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. ...
- Linux安装gcc编译器详解
本人使用的是CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编 ...
- GCC编译器和GDB调试器常用选项
http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello ...
- 临时改GCC编译器,重启后失效
临时改GCC编译器,重启后失效.例如,用如下命令: export CROSS_COMPILE= <gcc 文件所在的目录>/arm-linux-gnueabihf- 本例中使用的命令如下: ...
- windows下安装,配置gcc编译器
在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指仅仅用自由软件来生成纯粹的Win32可运行文件的编译环境,它是Minimalist GNU on Windows的略称. ...
- gcc编译器与基本类型3
C语言发展史 1969年贝尔实验室 肯尼斯·蓝·汤普逊,丹尼斯·李奇开发了B语言 ->Unix,New B语言,改名C语言83年提出C语言标准 1989年十二月正式通过C语言标准,C89标准 C ...
随机推荐
- MFC ADO连接Oracle12c数据库 服务端配置
要想客户端访问服务器端的oracle数据库的话,还需要服务端设置下监听程序及本地网络服务名配置. 发现百度文库上面有这方面的文档,我就不重复写了.请参照一下网址: http://wenku.baidu ...
- ruby -- 进阶学习(十三)解说ckeditor在production环境下如何完整显示
将ROR项目从development环境改为production环境时,运行rake assets:precompile后, ckeditor的界面就无法完整显示?! @_@?? 出现 ActionC ...
- NOP登录验证管理
截取Nop登录代码如下: 其实 public ActionResult Login(LoginModel model, string returnUrl, bool captchaValid) { / ...
- iOS-多线程-GCD
一. 名词解释: 1. 进程和线程 进程是指在系统中正在运行的一个应用程序.每个进程之间都是独立的,每个进程均运行在期专用而且受到保护的内存空间中. 线程是指一个进程想要执行任务,就必须要有线程.线程 ...
- Vue基础---->VueJS的使用(二)
组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.今天我们就来学习一 ...
- [Windows] 批处理文件系统服务控制
在cmd下可有两种方法打开,net和sc. net只能用于用于打开没有被禁用的服务. 启动: net start 服务名 停止: net stop 服务名 sc可打开被禁用的服务. sc config ...
- Laravel 5 服务的注册和使用
首先我们需要创建一个服务的类,比如叫CqhServiceProvider,最简单的方式就是用artisan来帮我们创建 php artisan make:provider CqhServiceProv ...
- SQL Server 存储(8/8):理解数据文件结构
这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的. 我们都已经知道,SQL Server把数据文件分成8k的页,页是IO的最小操作单位.SQL Server把数据文件里的第1页标记为 ...
- 使用自带的JavaScriptSerializer序列化实体 指定的属性如何不序列化
public class GridConfig { public string width = "100%"; public string source = "dataA ...
- ValidationSugar表单验证框架-支持ASP.NET MVC ASP.NET WebFroM
ValidationSugar表单验证框架的优点: 1.支持javascript端和后端的双重验证 (前端目前依赖于jquery.validate.js,也可以自已扩展) 2.代码简洁 3.调用方便 ...