编译最多可以涉及四个阶段:预处理(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(可理解为输出汇编文件,因为汇编文件后缀为.s)
在正确编译阶段完成后中止后缀步聚(即,中止继续执行汇编和连接两个步聚)。输出是具体的每一个非汇编输入文件对应的汇编代码文件。按默认,源文件的汇编文件名通过用.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.
……
……
……