GCC3.4.6中文文档

本文详细介绍了GCC编译器的使用,包括文件后缀、编译阶段、选项分类和具体选项的作用。例如,-c选项用于编译源文件但不进行连接,-E选项仅执行预处理,-std选项指定语言标准,-ansi则要求符合ANSI C90标准。文章还提到了预处理选项如-include用于包含文件,连接选项如-l和-L用于添加库和库搜索路径。此外,还讨论了头文件搜索路径、汇编选项以及对汇编器和连接器的参数传递。
摘要由CSDN通过智能技术生成

FROM:http://hi.baidu.com/dereklouie/blog/item/2aaa31813ae0a1dabd3e1e67.html


1、GCC编译器及文件后缀

C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的 语言,但是对编译器来说,后缀名控制着缺省设定: 
gcc
认为预处理后的文件(.i)是C文件,并且设定C形式的连接. 
g++ 
认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接. 
源文件后缀名指出语言种类以及后期的操作: 
.c       C源程序;预处理,编译,汇编
.C       C++源程序;预处理,编译,汇编
.cc      C++源程序;预处理,编译,汇编
.cxx     C++源程序;预处理,编译,汇编
.m       Objective-C源程序;预处理,编译,汇编
.i      预处理后的C文件;编译,汇编
.ii     预处理后的C++文件;编译,汇编
.s      汇编语言源程序;汇编
.S      汇编语言源程序;预处理,汇编
.h      预处理器文件;通常不出现在命令行上

其他后缀名的文件被传递给连接器(linker).通常包括: 
.o      目标文件(Object file)
.a      归档库文件(Archive file)

除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的 .o目标文件和.a库文件)按命令行中的顺序传递给连接器. 
选项
选项必须分立给出: `-dr'完全不同于`-d -r '. 
大多数`-f'和`-W'选项有两个相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).这里 只列举不是默认选项的格式. 下面是所有选项的摘要,按类型分组,解释放在后面的章节中.

2、通用控制输出选项
-x language 
明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).这个选项应用于后面 所有的输入文件,直到遇着下一个`-x'选项. language的可选值有`c', `objective-c', `c-header', `c++', `cpp-output', `assembler',和`assembler-with-cpp'. 
-x none 
关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x'选项). 
如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x'选项(或文件名后缀)告诉 gcc从哪里开始,用`-c', `-S',或`-E'选项告诉gcc到 哪里结束.注意,某些选项组合(例如, `-x cpp-output -E')使gcc不作任何事情. 
-pass-exit-codes 
通常gcc会在出错的时候返回1;用这个选项会返回实际上从预处理、编译、汇编、连接阶段中真正的返回值而不是只用1来代替。
-c 
编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件. 缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i', `.s',等等,产生目标文件名.可以使用-o选项选择其他名字. GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编). 
-S 
编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件. 缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i',等等,产生 目标文件名.可以使用-o选项选择其他名字. GCC忽略任何不需要编译的输入文件. 
-E 
预处理后即停止,不进行编译.预处理后的代码送往标准输出。GCC忽略任何不需要预处理的输入文件。 
-o file 
指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是 预处理后的C代码. 由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o'选项没有意义,除非输出一个可执行文件. 如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out', `source.suffix '的目标文件是`source.o',汇编文件是 `source.s',而预处理后的C源代码送往标准输出. 
-v 
屏幕(标准错误输出)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号. 
-pipe 
在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的 汇编器不能从管道读取数据. GNU的汇编器没有这个问题. 
--help 
在标准输出设备上打印命令选项;加上-v之后会显示的比较完整。如果加上-Wextra没有关联文档的也会显示出来。
--target-help 
   为每一个工具显示特定目标的命令行选项的描述
--version 
列出版本信息。

3、C语言控制选项
下列选项控制编译器能够接受的C "方言": 
-ansi 
C模式下支持所有ISO C90程序,C++模式下,除掉与ISO C++冲突的GNU扩展;使用这个选项会关闭与标准C/C++不相容的一些特性,例如asm, typeof关键字和一些预定义的象unix和vax这样的这些表明当前系统类型的预定义宏. 同时开启不受欢迎和极少使用的ANSI trigraph特性。在C语言中取消了C++中才能使用的//注释标记和inline关键字。
这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启 不受欢迎和极少使用的ANSI trigraph特性,以及禁止`$'成为标识符的一部分. 
尽管使用了`-ansi'选项,下面这些可选的关键字, __asm__, __extension__, __inline__和__typeof__仍然有效.你当然不会把他们用在ANSI C程序中,但可以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定 `-ansi'选项.另外一些预定义宏,如__unix__和__vax__,无论有没有使用 `-ansi'选项,始终有效.
使用`-ansi'选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic'选项作为 `-ansi'选项的补充. 
使用`-ansi'选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方 使用这些名字的程序了. 
-std= 
   这个选项只支持C/C++,用来确定语言标准;必须取如下值:
`c89' 
`iso9899:1990' 
ISO C90 (same as -ansi). 
`iso9899:199409' 
ISO C90 的修改版; 
`c99' 
`c9x' 
`iso9899:1999' 
`iso9899:199x' 
不完全支持ISO C99标准,`c9x' 和 `iso9899:199x'是不可取的; 
`gnu89' 
默认, ISO C90 加上GNU 扩展 (包含一些C99特征). 
`gnu99' 
`gnu9x' 
ISO C99 加上GNU 扩展. 当ISO C99 完全实施在GCC中时, 这个就是默认的。 `gnu9x' 是不可取的。 
`c++98' 
1998 ISO C++ 标准加上些修改. 
`gnu++98' 
The same as -std=c++98 plus GNU extensions. 这是C++ 代码的默认选项;
即使这个选项没有指定,也可以使用新版本的一些特征,因为他们不会与低版本冲突;例如,即使没有指定-std=c99也可以用__restrict__。
除了在-ansi中有些特定版本中支持而ISO C90不支持的特性被禁用外,与-ansi作用相同。
-aux-info filename 
输出给定文件的所有在转换单元中(包括在头文件中)定义或声明的函数的原型声明。这个选项只支持C语言。
除了原型声明,在文件的注释中还指出了出处(文件和行号),函数的隐式声明、原型声明或者非原型声明(`I', `N' for new or `O' for old, 位于行号后面的第一个字母) ,以及在该处是声明还是定义 (`C' or `F', 第二个字母)。
如果是定义还会在后面的注释中列出函数参数和类型。
-fno-asm 
不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用 __asm__, __inline__和__typeof__能够替代他们. `-ansi' 隐含声明了`-fno-asm'. -fno-builtin 不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen. 
`-ansi'选项能够阻止alloca和_exit成为内建函数. 
-fno-builtin 
-fno-builtin-function 
不接受没有以`__builtin_'为前缀的内建函数。
在正常情况下,GCC生成一些特定代码来非常高校地处理内建函数,例如,调用alloca会生成直接调整堆的指令,调用memcpy会生成内联的拷贝循环。最终代码常常会很小而且更快;但是如果函数调用不以这种形式出现,你将不能在这些调用中设置断点,也不能通过链接别的库来改变这些函数的功能。使用-fno-builtin-function选项只有内建函数无效。Function 不能以‘__builtin_'为开头。没有队赢得-fbuiltin-function选项,如果在使用-fno-builtin 或者-ffreestanding的前提下,要选择性的启用内建功能可以象下面这样定义宏:
           #define abs(n)           __builtin_abs ((n))
           #define strcpy(d, s)     __builtin_strcpy ((d), (s))
-fhosted 
按宿主环境编译;他隐含声明了`-fbuiltin'选项, 宿主环境包含了整个标准库,main以int返回。与-fno-freestanding作用相同,不能用来编译内核。 
-ffreestanding 
按独立环境编译;他隐含声明了`-fno-builtin'选项, 独立环境可能没有内核而且程序也不一定从main函数开始运行。最明显的例子就是编译操作系统内核。与-fno-hosted作用相同。
-trigraphs 
支持ANSI C trigraphs. `-ansi'选项隐含声明了`-trigraphs'. 
-no-integrated-cpp 
只执行预处理和编译两个阶段。选项允许用户通过-B选项提供"cc1", "cc1plus", or "cc1obj"。也可以在预处理和编译两个阶段中间再加上一个预处理过程。
-traditional 
-traditional-cpp 
只支持-E开关,预处理程序以pre-standard模式工作。 
-fcond-mismatch 
允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void. 
-funsigned-char 
把char定义为无符号类型,如同unsigned char. 
各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed char .理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或unsigned char.但是许多程序已经写成只用简单的char,并且期待这是有符号数(或者无符号数,具体情况取决于 编写程序的目标机器).这个选项,和它的反义选项,使那样的程序工作在对应的默认值上. char的类型始终应该明确定义为signed char或unsigned char,即使它表现的和其中之一完全一样. 
-fsigned-char 
把char定义为有符号类型,如同signed char. 
这个选项等同于`-fno-unsigned-char',他是the negative form of `-funsigned-char'的相反选项.同样, `-fno-signed-char'等价于 
-fsigned-bitfields 
-funsigned-bitfields 
-fno-signed-bitfields 
-fno-unsigned-bitfields 
如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域(bitfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类型,如int,是 有符号数. 然而,如果指定了`-traditional'选项,位域永远是无符号数. 
-fwritable-strings 
把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们假设字符串常量是可写的. `-traditional'选项也有相同效果. 篡改字符串常量是一个非常糟糕的想法; ``常量''就应该是常量.
4、预处理选项
下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理. 
如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必须和`-E'选项一起才有意义,因为他们的输出结果不能用于编译. 
-include file 
在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译. 命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在命令行上的顺序如何.然而`-include'和`-imacros'选项按书写顺序处理. 
-imacros file 
在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件file的输出内容, `-imacros file'选项的唯一效果就是使文件file中的宏定义生效, 可以用于其他输入文件.在处理`-imacrosfile'选项之前,预处理器首先处理`-D' 和`-U'选项,并不在乎他们在命令行上的顺序.然而`-include'和 `-imacros'选项按书写顺序处理. 
-idirafter dir 
把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I'添加的路径)中没有找到,预处理器就搜索第二包含路径. 
-iprefix prefix 
指定prefix作为后续`-iwithprefix'选项的前缀. 
-iwithprefix dir 
把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里 prefix被先前的`-iprefix'选项指定. 
-nostdinc 
不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果合适). 结合使用`-nostdinc'和`-I-'选项,你可以把包含文件搜索限制在显式指定的目录. 
-nostdinc++ 
不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg++'时使用 这个选项.) 
-undef 
不要预定义任何非标准宏. (包括系统结构标志). 
-E 
仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件. 
-C 
告诉预处理器不要丢弃注释.配合`-E'选项使用. 
-P 
告诉预处理器不要产生`#line'命令.配合`-E'选项使用. 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值