一、GCC功能介绍
GCC编译器完成从C、C++、objective-C等源文件向运行在特定CPU硬件上的目标代码的转换(这是任何一个编译器需要完成的任务)。
GCC能够处理的源文件分为C、C++、Objective-C、汇编语言等。对于这些源文件,用他们的后缀名进行标示。GCC能够处理的后缀有:
a. *.c *.C (C语言)
b. *.cxx *.cc (C++语言)
c. *.m (面向对象的C)
d. *.i (预处理后的C语言源文件)
e. *.ii (预处理后的C++语言源文件)
f. *.s *.S (汇编语言)
h. *.h (头文件)
目标文件可以是:
a. *.o 编译连接后的目标文件
b. *.a 库文件
编译器把编译生成目标代码的任务分为以下4步:
1)预处理,把预处理命令扫描处理完毕;
2)编译,把预处理后的结果编译成汇编或者目标模块;
3)汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;
4)连接,把多个目标代码模块连接生成一个大的目标模块;
二、GCC开关
GCC的运行开关共分为11类,这是类开关从11个方面控制着GCC程序的运行,以达到特定的编译目的。
2.1全局开关(OVERALL OPTIONS)
全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在 某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如拟的目的是为了看某个CPU上的汇编语言怎么写)。
1、–x language
对于源文件是用什么语言编写的,可以通过文件名的后缀来标示,也可以用这开关。指定输入文件是什么语言编写的,language 可以是如下的内容
1)c
2)objective-c
3)c-header
4)c++
5)cpp-output
6)assembler
7)assembler-with-cpp
2、–x none 把上一节介绍的-x开关都给关掉了。
3、–c 编译成把源文件目标代码,不做连接的动作。
4、–S 把源文件编译成汇编代码,不做汇编和连接的动作。
5、–E 只把源文件进行预处理之后的结果输出来。不做编译,汇编,连接的动作。
6、–o file 指明输出文件名是file。
7、–v 把整个编译过程的输出信息都给打印出来。
8、–pipe
由于gcc的工作分为好几步才完成,所以需要在过程中生成临时文件,使用-pipe就是用管道替换临时文件。
2.2语言相关开关(Language Options) :用来处理和语言相关的控制开关。
1、–ansi
这个开关让GCC编译器把所有的gnu的编译器特性都给关掉,让你的程序可以和ansi标准兼容。 除了以上的开关外,语言相关开关还有很多。
2.3用来控制预处理所设置的开关。
1、–include file
在编译之前,把file包含进去,相当于在所有编译的源文件最前面加入了一个#include <file>语句。
2、–imacros file
同-include file 一样。不过这个文件在具体编译的时候只有里面定义的宏才起作用,所以值用来在file文件里面定义宏。
3、–nostdinc
在搜寻include 的文件路径中去掉标准的c语言头文件搜索路径,例如stdio.h文件就是放在标准头文件搜索路径下。
4、–nostdinc++ 同上,只是去掉的是标准C++语言的头文件搜索路径。
5、–C 同-E参数配合使用。让预处理后的结果,把注释保留,让人能够比较好读它。
6、–Dmacro 把macro定义为字符串’1’。
7、–Dmacro = defn 把macro定义为defn。
8、–Umacro 把对macro的定义取消。
2.4汇编开关(Assembler Option) :用来控制汇编行为的开关。
1、–Wa , option
把option作为开关送给汇编程序。如果option里面有逗号,则作为好几行进行处理。
2.5连接开关(Linker Options) :用来控制连接过程的开关选项。
1、object-file-name
2、–llibrary 连接库文件开关。例如-lugl,则是把程序同libugl.a文件进行连接。
3、–lobjc 这个开关用在面向对象的C语言文件的库文件处理中。
4、–nostartfiles 在连接的时候不把系统相关的启动代码连接进来。
5、–nostdlib 在连接的时候不把系统相关的启动文件和系统相关的库连接进来。
6、–static 在一些系统上支持动态连接,这个开关则不允许动态连接。
7、–shared 生成可共享的被其他程序连接的目标模块。
2.6目录相关开关(Directory Options) :用于定义与目录操作相关的开关。
1、–Idir 宏include需要搜寻的目录。
2、–I- 与-I开关类似。
3、–Ldir 搜寻库文件(*.a)的路径。
2.7 警告开关(Warning Options) :与警告处理相关的开关。
1、–fsyntax-only 只检查代码中的语法错误,但并没有输出。
2、–w 禁止一切警告信息打印出来。
3、–Wno-import 禁止对宏#import提出警告。
4、–pedantic
5、–pedantic-errors
6、–W
2.8 调试开关(Debugging Options)
1、–g 把调试开关打开,让编译的目标文件有调试信息。
2.9 优化开关(Optimization Options)
-O1 –O2 –O3 –O0,这些开关分别控制优化的强度,-O3最强。
2.10 目标机开关(Target Options)
1、–b machine
在有的时候,Gcc编译器编译出来的目标代码并不是在运行这个编译动作的机器上运行而是另外一台机器,这种编译叫做交叉编译,用来运行最终目标代码的得机器叫做目标机,machine就是用来指明目标机的类型的。
2、–V version 用来告诉编译器使用它的多少版本的功能,version参数用来表示版本。
2.11 CPU相关开关(Machine Dependent Options) :比较多,也是在交叉编译的时候用得着。
三、GCC 使用指南
1、使用语法:
gcc [ option | filename ]…
g++ [ option | filename ]…
其中option为gcc使用时的选项(后面会再详述), 而filename为欲以gcc处理的文件
说明: 这 C 与 C++ 的 compiler 已将产生新程序的相关程序整合起来。产生一个新的程序需要经过四个阶段:预处理、编译、汇编、连结,而这两个编译器都能将输入的文件做不同阶段的处理。虽然原始程序的扩展名可用来分辨编写原始程序码所用的语言,但不同的compiler,其预设的处理程序却各不相同:
1)gcc 预设经由预处理过(扩展名为.i)的文件为 C 语言,并於程式连结阶段以 C 的连结方式处理。
2)g++ 预设经由预处理过(扩展名为.i)的文件为 C++ 语言,并於程序连结阶段以 C++ 的连结方式处理。
2、原始程序码的扩展名指出所用编写程序所用的语言,以及相对应的处理方法:
.c C 原始程序 ; 预处理、编译、汇编
.C C++ 原始程序 ; 预处理、编译、汇编
.cc C++ 原始程序 ; 预处理、编译、汇编
.cxx C++ 原始程序 ; 预处理、编译、汇编
.m Objective-C 原始程序 ; 预处理、编译、汇编
.i 已经过预处理之 C 原始程序 ; 编译、汇编
.ii 已经过预处理之 C++ 原始程序 ; 编译、汇编
.s 组合语言原始程序 ; 汇编
.S 组合语言原始程序 ; 预处理、汇编
.h 预处理文件(标头文件) ; (不常出现在指令行)
其他扩展名的文件是由连结程序来处理,通常有:
.o Object file
.a Archive file
3、除非编译过程出现错误,否则 “连结” 一定是产生一个新程序的最後阶段。然而你也可以以 -c、-s 或 -E 等选项,将整个过程自四个阶段中的其中一个停止。在连结阶段,所有与原始码相对应的.o文件、程序库、和其他无法自文件名辨明属性的文件(包括不以.o 为扩展名的 object file 以及扩展名为 .a 的 archive file)都会交由连结程序来处理(在指令行将那些文件当作连结程序的参数传给连结程序)。
4、选项:
1)不同的选项必须分开:例如 `-dr’ 这个选项就与 `-d -r’ 大不相同。
2)绝大部份的 `-f’ 及 `-W’ 选项都有正反两种形式:-fname 及-fno-name (或 -Wname 及 -Wno-name)。以下只列出非预设的那个形式。
3)一般性(概略、常用的)选项:-c -S -E -o file -pipe -v -x language
文件说明
file.c C source file
file.h C header (preprocessor) file
file.i 经预处理过的 C source file
file.C C++ source file
file.cc C++ source file
file.cxx C++ source file
file.m Objective-C source file
file.s assembly language file
file.o object file
a.out link edited output
TMPDIR/cc* temporary files
LIBDIR/cpp preprocessor
LIBDIR/cc1 compiler for C
LIBDIR/cc1plus compiler for C++
LIBDIR/collect linker front end needed on some machines
LIBDIR/libgcc.a GCC subroutine library
/lib/crt[01n].o start-up routine
LIBDIR/ccrt0 additional start-up routine for C++
/lib/libc.a standard C library, 参阅 man page intro(3)
/usr/include standard directory for #include files
LIBDIR/include standard gcc directory for #include files
LIBDIR/g++-include additional g++ directory for #include
LIBDIR is usually /usr/local/lib/machine/version.
TMPDIR comes from the environment variable TMPDIR (default
/usr/tmp if available, else /tmp).
四、简易命令参数汇总
-o FILE
指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out.
-c 只编译不链接
-DFOO=BAR 在命令行定义预处理宏FOO,其值为BAR
-IDIRNAME 将DIRNAME加入到头文件的搜索目录列表中
-LDIRNAME 将DIRNAME加入到库文件的搜索目录列表中,缺省情况下gcc 只链接共享库
-static 链接静态库,即执行静态链接
-lFOO 链接名为libFOO的函数库
-g 在可执行程序中包含标准调试信息
-ggdb 在可执行程序中包含只有GNU debugger才能使别的达两条是信息
-O 优化编译过的代码
-ON 指定代码优化的级别为N,o<=N<=3
-ansi 支持ANSI/ISO C的标准语法,取消GNU的语法扩展中与该标准有冲突的部分
(但这一选项并不能保证生成ANSI兼容的代码)
-pedantic 允许发出ANSI/ISO C标准所列出的所有警告
-pedantic -errors 允许发出ANSI/ISO C标准所列出的所有错误
-traditional 支持Kernighan & Ritchie C语法(如用旧式语法定义函数);如果不知道这个选项的含义,也没有关系
-w 关闭所有警告,建议不要使用此项
.Wall 允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告
-werror 把所有警告转换为错误,以在警告发生时中止编译过程
-MM 输出一个make兼容的相关列表
-v 显示在编译过程的每一步中用到的命令
-lpthread 编译多线程程序