Linux学习第三篇

第三,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),即使分支需要大范围转移.

 

来自仲的整理

你可能感兴趣的:(linux,汇编,gcc,编译器,linker,preprocessor)