第三,Linux开发工具1—gcc
C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言
源文件后缀名指出语言种类以及后期的操作:
.c C源程序;预处理,编译,汇编
.C C++源程序;预处理,编译,汇编
.cc C++源程序;预处理,编译,汇编
.cxx C++源程序;预处理,编译,汇编
.m Objective-C源程序;预处理,编译,汇编
.i 预处理后的C文件;编译,汇编
.ii 预处理后的C++文件;编译,汇编
.s 汇编语言源程序;汇编
.S 汇编语言源程序;预处理,汇编
.h 预处理器文件;通常不出现在命令行上
其他后缀名的文件被传递给连接器(linker).通常包括:
.o 目标文件(Object file)
.a 归档库文件(Archivefile)
选项(OPTIONS)
总体选项(OverallOption)语言选项(Language Option)警告选项(Warning Option)调试选项(Debugging Option)优化选项(Optimization Option)预处理器选项(Preprocessor Option)汇编器选项(Assembler Option)连接器选项(Linker Option)目录选项(Directory Option)目标机选项(Target Option)配置相关选项(Configuration Dependent Option)代码生成选项(Code Generation Option)
详解
如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x'选项(或文件名后缀)告诉 gcc从哪里开始,用`-c', `-S',或`-E'选项告诉gcc到 哪里结束.注意,某些选项组合(例如, `-xcpp-output -E')使gcc不作任何事情.
-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源代码送往标准输出.
-shared:生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支持该选项.
-llibrary:连接名为library的库文件. 连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a'.连接器会 当做文件名得到准确说明一样引用这个文件. 搜索目录除了一些系统标准目录外,还包括用户以`-L'选项指定的路径. 一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive file).连接器处理归档文件的 方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义.但是,如果连接器找到普通的 目标文件,而不是库文件,就把这个目标文件按平常方式连接进来.指定`-l'选项和指定文件名的唯一区别是, `-l选项用`lib'和`.a'把library包裹起来,而且搜索一些目录.
-w:禁止所有警告信息
-Wall:生成所有警告信息
-g:以操作系统的本地格式(stabs,COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息.
-O: 对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-fpic:如果支持这种目标机,编译器就生成位置无关目标码.适用于共享库(sharedlibrary).
-fPIC:如果支持这种目标机,编译器就输出位置无关目标码.适用于动态连接(dynamiclinking),即使分支需要大范围转移.
来自仲的整理