GCC 简介

8 篇文章 0 订阅
5 篇文章 0 订阅

GCC 的基本使用

GCC 是一款非常著名的编译器,支持诸如 C, C++, Java在内的多种程序设计语言,并且提供了许多选项,以支持用户不同程度的需求,例如查看编译中间结果,指定语言标准,指定优化程度等等 ,下面的内容就介绍这些最重要的功能。

首先查看一下 GCC 的版本,有时候可能版本不同,编译的功能和结果就不同。 这里 有不同版本的手册。

查看版本

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

编译过程

一次编译

如果想直接得到可执行文件,最简单的是这样:

    gcc test.c -o test

分段编译

有时候,我们可能需要看到编译的中间结果,比如查看汇编代码,没有经过链接的二进制文件等等,这时候可以这样:

  • 源文件->预处理->中间文件

    gcc -E test.c -o test.i
    
  • 中间文件->编译->汇编文件

       gcc -S test.i -o test.s
    
  • 汇编文件->转换->二进制代码

       gcc -c test.s -o test.o
    
  • 二进制代码->链接->可执行文件

       gcc test.o -o test
    

设定C语言标准

不同的标准对于语言特性的支持是不一样的,所以一定要关注标准,别写了半天程序连自己是在什么标准下写的都不知道。

关于C语言的标准,首先要提到的就是 ANSI C, 1989年批准,即C89,1990年批准成为ISO标准,即C90或ISO/IEC 9899:1990。C89和C90其实是一样的。可以使用 -ansi 或者 -std=c89 或者 -std=c90 或者-std=iso9899:1990 来指定,例如:

 $ gcc -ansi test.c -o test
 $ gcc -std=c89 test.c -o test
 $ gcc -std=iso9899:1990 test.c -o test

在1999年,新版本的C语言标准发布,即 ISO/IEC 9899:1999,江湖人称C99。C99引入了一些新特性,例如:inline 函数,long long int 类型,变长数组,单行注释等等 。GCC对此标准的支持并不完整,但许多新特性已经可以支持。可以使用-std=c99或者 -std=iso9899:1999 来指定。

下一个版本的C语言标准是C1X,正在制定中,GCC只支持其中一部分特性,可以使用-std=c1x来指定。

另外,GCC对各个C语言标准都提供了一些扩展,可以使用 -std=gnu89 或者 -std=gnu99 或者 -std=gnu1x来指定。

如果没有指定标准,默认情况下 GCC 使用 -std=gnu90

更多关于GCC支持的语言标准的描述,可以在这里找到:Language Standards Supported by GCC 。

关于各个标准的简介可以在 Wikipedia 的 C (programming language) 的 History 中找到,另外强烈建议把这个词条完整地阅读一遍,可以对C语言有一个全方位的概览。

ISO对于各个标准的介绍可以在 iso9899中找到。

警告

GCC 的警告信息有时候会给我们一些非常重要的提示,防止我们写出错误的程序,最常用的选项是 -Wall,意思是打开全部的警告信息。如果没有错误,仅仅是得到了警告,程序不会停止编译,因为警告不一定是错误的。但是如果你对程序要求比较高,想让编译器在出现警告时停止编译,那么可以在-Wall基础上,使用 -Werror 选项,这样GCC会把警告当成错误来处理。

例如,我们有这样一个程序:

#include <stdio.h>

int main(void) {
    int foo = 2;

    if (foo = 1) {
        printf("hello, world\n");
    }
    return 0;
}

注意 = 和 == 的区别,我们试试警告选项:

$ gcc -Wall -ansi test.c -o test
test.c: In function ‘main’:
test.c:6:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

可以看出,GCC对我们提出了警告。我们再加上 -Werror 试试:

$ gcc -Wall -Werror -ansi test.c -o test
test.c: In function ‘main’:
test.c:6:5: error: suggest parentheses around assignment used as truth value [-    Werror=parentheses]
cc1: all warnings being treated as errors

这一次,GCC把上一次的警告当成错误来处理了。

关于 GCC Warning 的更多信息可以在 GCC文档的 Warnign Options中找到。

调试信息

有时候我们的程序需要使用 GDB 来调试,就需要在编译时加入调试信息,可以通过 -g 选项来加入:

$ gcc -g -ansi test.c -o test

然后通过 GDB 来调试:

$ gdb test
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/minix/Project/C/language/test...done.

可以看到最后一句,gdb 从 test中读取到了 symbols。

更多关于GCC调试的描述可以在 GCC 文档的 Debugging Options中找到。

优化

GCC 可以对程序提供不同程度的优化,-O0 不提供任何优化,这也是默认的情况,从 -O1 到 -O3提供越来越多的优化,例如:

$ gcc -O1 test.c -o test
$ gcc -O3 test.c -o test

更多关于优化的信息可以在 GCC 文档的 Optimize Options中找到。

好了,就讲到这里。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GCC是GNU Compiler Collection(GNU编译器集合)的缩写,它是一个流行的开源编译器套件。GCC在许多操作系统上广泛使用,并支持多种编程语言,如C、C++、Objective-C、Fortran等。 深入分析GCC PDF文档主要包含以下内容: 1. 简介和背景:PDF文档可能会提供GCC的历史和发展背景,讲解GCC作为一个自由软件项目的诞生和发展过程。还可能涵盖GCC发行版本的演变和GCC在开源社区中的地位。 2. GCC编译器的组成:PDF文档可能会详细描述GCC编译器的各个组成部分,如预处理器、编译器、汇编器和链接器等。还会介绍这些组件的功能、作用和相互关系。 3. 支持的编程语言:PDF文档可能会列举GCC支持的编程语言,并描述GCC在各种语言的编译器方面的特点和能力。对于每种语言,可能会介绍GCC支持的语言特性、可用的优化选项和编译器扩展。 4. 编译器选项和优化:PDF文档可能会提供关于GCC编译器选项和优化技术的详细信息。这些信息可以帮助开发人员更好地了解如何使用GCC编译器进行代码编译和优化,以提高代码性能和效率。 5. 跨平台支持和移植性:PDF文档可能会介绍GCC作为一个跨平台编译器的优势和特点。它可能会说明GCC可用于多种操作系统和硬件平台,并提供基于GCC的开发环境设置和配置方面的指导。 6. GCC扩展和插件:PDF文档可能会介绍GCC的扩展和插件生态系统,包括GCC插件开发和GCC扩展库的使用。它可能会提供关于如何为GCC开发和集成自定义编译器功能和扩展的指导。 总之,通过深入分析GCC PDF文档,我们可以获得关于GCC编译器的详细信息,包括其组成、支持的编程语言、编译器选项和优化技术,以及其在跨平台开发和扩展方面的特点和能力。这些信息对于开发人员来说非常有价值,可以帮助他们更好地使用GCC编译器进行开发和优化。 ### 回答2: GCC(GNU编译器集合)是一个开源的编程语言编译器套件,可以编译多种语言,如C、C++、Fortran等。GCC的开发由自由软件基金会(FSF)领导,并得到全球广泛的开发者社区的支持。 深入分析GCC PDF,首先要了解GCC的基本架构和工作原理。GCC由多个组件组成,包括前端、中端和后端。前端负责将不同的源代码转换为中间代码,中端进行中间代码的优化和转换,而后端根据目标平台将中间代码转换成机器码。 GCC PDF中通常包含GCC的各个组件的详细说明、接口定义和使用示例。可以从PDF中了解GCC的各个组件是如何协同工作的,每个组件的功能和作用分别是什么。这对于理解GCC的整体架构和代码编译的流程非常重要。 此外,GCC PDF还通常包含GCC支持的语言特性、编译选项和优化技术等相关信息。对于不同的语言特性和编译选项,PDF中可以提供详细的解释和示例,使开发者可以更好地理解和利用GCC提供的功能。 对于想要深入了解GCC的开发者来说,GCC PDF还可以提供GCC代码的详细解析和实现原理等内容。通过阅读PDF中的相关章节,可以更深入地了解GCC的内部工作机制和算法,对GCC进行二次开发或优化具有很大帮助。 总之,深入分析GCC PDF对于理解GCC的工作原理、代码结构和使用方式非常有帮助。通过研读PDF中的内容,可以更好地使用GCC进行代码编译、优化和开发,并为GCC的二次开发和改进提供理论基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值