gcc

GNU C/C++编译器


语法格式

gcc [-c|-S|-E] [-gQsSvw] [-D name[=value]] [-I dir] [-lname] [-L dir] [-o file]
        [-O[n]] [-std=standard] [-U name] [-Wwarns] [-x language] [@file] ……
        infiles
gcc [--help] [--version]

命令简介

gcc是一个庞大的综合编译系统,其中包括预处理、编译、汇编以及连接等一组开发工具。除了标准的C语言,gcc还支持C++和Fortran等语言的编译。

在上述语法格式中,infiles是欲编译的源代码文件或汇编语言文件,也可以是需要连接的目标文件。

如果未指定任何选项,gcc直接支持C语言程序、汇编语言程序和目标文件等,执行预处理、编译、汇编与连接等标准的处理过程,生成名为a.out的可执行文件。使用“-E、“-S”或“-c”等通用选项,可以在执行到某一中间处理阶段之后停止继续处理。

如果gcc仅执行部分处理阶段,生成的文件分别是在源文件名的基础上,以“.o”、“.s”或“.S”替代“.c”后缀之后的结果。下面以C语言程序文件为例,给出文件的命名惯例:

file.c  必须进行预处理的常规C源代码文件。

file.i  不需要预处理的C源代码文件。

file.h  C/C++头文件。

file.s  汇编语言文件。

file.S  必须进行预处理的汇编语言文件。

gcc支持多字符选项,因此,多个单字符选项通常应一一列出,而不要组合在一起使用。例如,“-pg”与“-p”和“-g”是完全不同的选项。

gcc提供数以百计的选项,支持代码的优化,警告信息的控制,指定可执行程序适用的目标系统,编译程序的类型与版本标准等。这里仅仅给出一小部分常用的通用选项,完整的介绍详见gcc手册页。

命令选项

-c  编译或汇编源代码文件,但省略连接阶段,不做连接。最终的结果是生成相应于每个源文件的目标文件,目标文件的名字通常是以“.o”代替源文件名的“.c”、“.i”、或“.s”等后缀。无法识别的文件、不要求编译或汇编的输入文件被忽略。

-D name[=value]  通常,#define预处理指令位于头文件或源代码文件的前部。使用这个选项可以在命令行上定义标识符。例如,“-D Linux”选项等价于上述文件中存在一个“#define Linux”定义,“-D MACH=i686”选项等价于上述文件中存在一个“#define MACH i686”定义。

-E  完成预处理阶段之后即停止,不执行编译等后续处理动作。最终结果是输出预处理后的源代码。不要求预处理的输入文件被忽略。

-g  生成的目标代码内嵌调试信息,供用户使用gdb等工具调试开发的程序。除非需要调试程序,通常不应使用这个选项。

-I dir  把指定的目录dir加到检索头文件的目录表前面,因此,gcc会优先检索“-I”选项指定的目录,然后再检索标准的系统头文件目录。使用这个选项,可以临时绕过系统头文件,使用自己定制的同名头文件替代标准的系统头文件。如果同时指定了多个“-I”选项,gcc将会按照从左到右的顺序依次检索每一个指定的目录,然后再检索系统头文件目录。如果指定的目录是一个标准的系统头文件目录,则忽略“-I”选项。

-lname  连接时从“-L”选项指定的目录和标准的库函数目录中检索指定的库函数libname.a。如果同时指定了多个“-l”选项,或在命令行中“-l”选项与目标文件共存,gcc将会按照从左到右的顺序依次检索库函数。

-L dir  把指定的目录dir加到供“-l”选项检索的目录表中。gcc将会优先检索“-L”选项指定的目录,然后再检索标准的系统库函数目录。

-o file  把编译后生成的代码写入指定的文件file。尽管这个选项通常主要用于指定存储可执行代码的文件,实际上也可用于指定存储其他处理阶段生成的中间代码的文件。也就是说,这个选项适用于任何编译阶段,不管生成的是可执行文件、目标文件、汇编代码文件,还是预处理后的源代码文件。如果未指定“-o”选项,默认的做法是把可执行文件写入a.out,把相应于源文件source.suffix的目标文件写入source.o,把汇编代码文件写入source.s,把预处理后的源代码文件写到标准输出等。例如,“gcc -s -o acode src.c”命令的结果是把gcc生成的汇编语言代码存储在acode文件而非默认的src.s文件。

-O[n]  优化编译,其中参数n是优化的级别,n可以取值0、1、2、3或s,数字越大优化程度越高,但编译时花费的时间越长,占用的内存越多,生成的代码容量也越大。如果省略了参数nn的默认值是1,gcc将会试图减少代码的容量和编译时间,避免执行需要花费较多编译时间的任何优化处理。如果指定的n为2,gcc将会执行除空间与速度折中考虑之外的任何优化处理步骤。与“-O1”选项相比,“-O2”选项将增加编译时间,提高生成后的代码的性能。如果指定了“-O3”选项,gcc将执行几乎所有的优化处理措施。“-O0”选项的主要目的是减少编译时间,生成适当的调试信息。“-Os”选项主要用于优化代码的大小,减小代码的容量。“-Os”选项类似于“-O2”选项,但会避免执行增加代码容量的优化处理步骤。

-Q  令编译器输出编译的每个函数名,以及在完成每个处理阶段之后输出有关的统计信息。

-s  从生成的可执行文件中删除所有的符号表和重定位信息。

-S  完成编译阶段之后即停止,不执行汇编和连接等后续处理动作。最终结果是把源代码文件编译成汇编代码文件。通常,汇编文件的名字是以“.s”代替源文件名的“.c”或“.i”等后缀。不需要编译或汇编的输入文件被忽略。

-U name  取消先前定义的任何name,包括源代码文件中存在的或使用“-D”选项提供的。

-v  通过标准错误输出,显示编译期间各个阶段执行的命令,同时显示编译程序及与处理程序等的版本号。

-w  禁止输出任何警告信息。

-Wall  指定这个选项之后,当发现代码中存在任何通过修改即可避免的问题时,gcc将输出相应的警告信息。参见后续的“-W”选项。

-Wcomment  若注释的起始字符序列“/*”出现在“/*”注释行中,或转义的换行符出现在“//”注释行中,则输出警告信息。

-Wimplicit  当引用的函数没有事先声明,或虽声明但没有指定类型时,输出警告信息。

-Wreturn-type  当函数定义的返回类型是默认的int类型时,或者函数中的return语句未提供返回值,但函数定义的返回类型并非void时,又或函数中的return语句提供了返回表达式,但函数定义的返回类型为void时,输出警告信息。

-Wunused  当发现变量、标号、函数及其参数已经声明但未使用时,输出警告信息。

-x language  指定输入文件采用的语言类型,如c、c++和f77等。none表示按照输入文件名的后缀确定文件的类型。其中,file.c是C语言源码文件,file.i是经过预处理的C语言源码文件,file.s是汇编语言源码文件,file.S是需要预处理的汇编语言源码文件。有关C++与Fortran等文件的后缀,详见gcc手册页。

-ansi  在编译C程序时,这个选项等价于“-std=c90”选项,支持ISO C90标准。在编译C++程序时,这个选项等价于“-std=c++98”选项,支持1998 ISO C++标准。

-fpic, -fPIC  生成位置独立的代码(PIC),适用于制作共享库函数。

-include file  这相当于在主源代码文件第一行增加一个“#include "file"”。如果同时指定了多个“-include”选项,gcc将会把指定的文件依序插入主源码文件中。

-mtune=cputype  使生成的代码适用于指定的CPU类型。其中,cputype可以是generic(针对通用的IA32/AMD64/EM64T处理器生成优化的代码)、native(编译时由编译器确定当前系统的CPU类型)、i386(早期的Intel i386 CPU)、i586(Intel Pentium CPU,支持MMX)、i686(类似于generic,适用于所有的i686系列CPU),以及corei7(Intel Core i7 CPU,64位,支持MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1和SSE4.2指令集)等。

-pipe  使用管道而非临时文件作为各种编译阶段之间的通信手段。注意,某些系统中的汇编程序如果不支持管道,使用这个选项将会失败。但GNU汇编程序没有问题。

-shared  生成共享的目标代码,从而能够供其他目标代码连接,最终生成可执行文件。这个选项通常应与“-fpic”或“-fPIC”等选项一起使用。

-static  在支持动态连接的系统中,防止连接程序连接共享库函数。

-static-libgcc, -shared-libgcc  在提供静态和共享版libgcc库函数的系统中,强制使用静态或共享库函数。

-std=standard  指定使用的语言标准。其中,standard可以是c90、c99(ISO C99)、gnu90(默认的C语言标准)、gnu99、c++98和gnu++98(默认的C++语言标准)等。

@file  从指定的文件中读取命令行选项。把读取的选项插入@file的位置,替换该选项。如果file不存在或无法读,则按文字处理该选项,但不会删除。选项的写法同命令行,多个选项之间需加空白字符作为分隔符。文件中也可以包括@file选项,采用同样的方法进行递归处理。

应用实例

1. 编译C语言程序atm.c,把最终生成的可执行代码存储在默认的a.out文件中。

$ gcc atm.c

2. 编译C语言程序monitor.c,汇编语言程序module.s,再连接目标文件funcs.o,把最终生成的可执行代码写入atmmon文件中。

$ gcc –o atmmon monitor.c module.s funcs.o

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z