编译最多可以涉及四个阶段预处理(preprocessing)、正确编译(compilation proper)、汇编(assembly)和链接(liking),且始终按此顺序进行前三个阶段适用于单个源文件,并以生成目标文件结束; 链接将所有目标文件(新编译的目标文件和指定为输入的目标文件)组合成可执行文件

1. 文件后缀名名规范说明

         对于任何指定的输入文件,文件名后缀决定进行哪种编译(注:在Linux平台下,这只是一种规范,实际靠编译脚本控制,或者按系统默认方式;在Windows平台下即必须如此)(以下“file”代表文件名):

file.c——必须预处理的C源代码文件。

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

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

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

file.m——Objective-C源代码文件。请注意,您必须链接 libobjc.a 库才能使 Objective-C 程序正常工作。 

file.mi——不需要预处理的Objective-C源代码文件。

file.h——C头文件(不需要预编译或链接)。

file.cc,file.cp,file.cxx,file.cpp,file.c++,file.C——必须预处理的C++源代码文件。

file.f,file.for,file.FOR——不需要预处理的Fortran源代码文件

file.F,file.fpp,file.FPP——必须预处理的Fortran源代码文件(用传统的预处理器)。

file.r——必须用RATFOR 预处理器预处理的Fortran源代码文件(不包括用GCC预处理)。

file.ads——Ada 源代码文件,其中包含库单元声明(包、子程序或泛型的声明,或泛型实例化)或库单元重命名声明(包、泛型或子程序重命名声明)。此类文件也称为“包规范(specs)”。

file.adb——包含库单元主体(子程序或包主体)的 Ada 源代码文件。此类文件也称为源文件主体(bodies)。

file.s——汇编语言源代码文件。

file.S——必须预处理的汇编语言源代码文件。

其它——直接输入链接的目标文件。任何没有可识别后缀的文件名都会以这种方式处理。

2. 输出选项说明

如果你想跳过某些编译阶段,你可以使用 –x (或者文件名后缀)来告诉gcc从何处开始编译,而 –c ,-S,或 –E 这些选项告诉gcc在何处停止。

2.1 –x(输入语言选项)

(1) -x language——显式指定输入语言。为随后的输入文件显式地指定语言(而不是让编译器根据文件名后缀选择一种默认的语言)。这个选项应用于所有随合的输入文件,直至遇到一下个-x选项为止。语言的可能值是:c, c-header,cpp-output,c++, c++-cpp-output,          objective-c,objc-cpp-output,assembler,assembler-with-cpp,ada,f77,f77-cpp-input,ratfor,java。

(2) -x none——关闭任何语言规范,因此,随后的文件按照其后缀名进行处理(就像没有使用任何 –x 选项那样)。

2.2  -pass-exit-codes

通常,如果gcc在任何编译阶段返回不成功的代码,gcc都会退出编译并返回1。如果你指定-pass-exit-codes选项,gcc 程序将返回任何阶段所产生的表明错误的最高数字错误。

2.3  -c(可理解为compile的首字母)

编译或者汇编源文件,但不进行链接。其最终输出是每个源文件对应的目标文件形式。按默认,源文件的目标文件名通过用.o替换掉文件名后缀 .c、.i、.s 、等等而构成。不识别的输入文件,不要求的编译或者汇编文件,会自动被忽略。

2.4  -S(可理解为Stop的首字母)

在正确编译阶段完成后中止后缀步聚(即,中止继续执行汇编和连接两个步聚)。输出是具体的每一个非汇编输入文件对应的汇编代码文件。按默认,源文件的汇编文件名通过用.s替换掉文件名后缀 .c、.i、等等而构成。不要求编译的输入文件会被自动忽略。

2.5  -E(可理解为Exit的首字母,因为未进行编译便退出)

    预处理完成后停止;不进行正确编译。输出为预处理源文件,会被发送到标准输出。不要求进行预处理的文件会被自动忽略。

2.5  -o file(可理解为output的首字母)

在文件file中放置输出内容。本选项适用于所产生的任意文件类型,无论其是可执行文件、目标文件、汇编程序文件还是预处理的 C 代码。由于只能指定一个输出文件,因此,当编译多于一个输入文件时,使用 -o 选项没有意义,除非你正要生成的输出文件是一个可执行文件

若没有指定 -o 选项,则默认输出为文件名为a.out的可执行文件(文件source.suffix”(源文件名.后缀)的目标文件是source.o”,其汇编文件名是“source.s”)和基于标准输出的所有c源代码文件

2.6  -v(可理解为verbose的首字母,显示编译详情)

基于标准错误输出(显示器等)打印编译阶段的执行命令。还打印编译器驱动程序、预处理器和编译器本身的版本号。

2.6  -###

    类似于-v选项,只不过不执行命令(注:因此,与编译过程相关的各种实时信息不会列出),会引用所有命令参数。这对于 shell 脚本捕获驱动程序生成的命令行很有用

2.7  -pipe

    使用管道而不是临时文件来实现各编译阶段之间的通信。这在汇编程序无法从管道读取信息的某些系统上不起作用;但在 GNU 汇编器中使用这个选项没有任何问题。

2.8  --help(注意,是两根短横线(--),与前面选项不同)

(在标准输出上)打印gcc所能理解的命令行选项的描述。如果还指定了 -v 选项,那么 --help 也会被传递给 gcc 调用的各个其它进程(即,子进程),以便它们可以显示它们所能接受的命令行选项。如果还指定了 -W 选项,则还将显示没有与其关联的文档的命令行选项。

    例如:

    gcc --help -v -W | more (注:显示内容太多,分页查看)

2.8  --target-help

(在标准输出上)打印每个工具所面向的目标的命令行选项的描述。例如:

gcc –target-help | more

输出:

    The following options are target specific:

  -m128bit-long-double        sizeof(long double) is 16.

  -m16                        Generate 16bit i386 code.

  -m32                        Generate 32bit i386 code.

  -m3dnow                     Support 3DNow! built-in functions.

  -m3dnowa                    Support Athlon 3Dnow! built-in functions.

  -m64                        Generate 64bit x86-64 code.

  -m80387                     Use hardware fp.

  -m8bit-idiv                 Expand 32bit/64bit integer divide into 8bit unsigned integer divide with run-time check.

  -m96bit-long-double         sizeof(long double) is 12.

  -mabi=                      Generate code that conforms to the given ABI.

  -mabm                       Support code generation of Advanced Bit Manipulation (ABM) instructions.

  -maccumulate-outgoing-args  Reserve space for outgoing arguments in the function prologue.

  -maddress-mode=             Use given address mode.

  -madx                       Support flag-preserving add-carry instructions.

  -maes                       Support AES built-in functions and code generation.

  -malign-data=               Use the given data alignment.

  -malign-double              Align some doubles on dword boundary.

  -malign-functions=          Function starts are aligned to this power of 2.

  -malign-jumps=              Jump targets are aligned to this power of 2.

  -malign-loops=              Loop code aligned to this power of 2.

  -malign-stringops           Align destination of the string operations.

  -mandroid                   Generate code for the Android platform.

  -march=                     Generate code for given CPU.

  -masm=                      Use given assembler dialect.

  -mavx                       Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AVX built-in functions and code generation.

  -mavx2                      Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and AVX2 built-in functions and code generation.

  -mavx256-split-unaligned-load Split 32-byte AVX unaligned load.

-mavx256-split-unaligned-store Split 32-byte AVX unaligned store.

……

……

……

10-19 20:12