GCC 的使用笔记

来源:互联网 发布:为什么电脑打不开淘宝 编辑:程序博客网 时间:2024/05/21 10:24

 GCC中文手册(2008.8.13)
主要是对中文手册内容的总结,在以后的使用过程中会不断的加入好的内容
================================================

描述
C和C++编译器是集成的,他们都要用四个步骤中的一个或多个处理输入文件:
这四个步骤是:
预处理(preprocessing),
编译(compilation),
汇编(assembly),
连接(linking),
源文件后缀名标识源文件的语言,但是对编译器来说后缀名控制着缺省设定。
gcc 认为预处理后的文件(.i)是C文件,并且设定C形式的连接
g++认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接
.i即预处理过的文件。
源文件后缀名指出语言各类以及后期的操作:
.c C源程序;预处理,编译,汇编 
.c C++源程序;预处理,编译,汇编
.cc C++源程序;预处理,编译,汇编
.cxx C++源程序;预处理,编译,汇编
.m Objective -c源程序;预处理,编译,汇编
.i 预处理理后的C文件;编译,汇编
.ii 预处理后的C++文件;编译,汇编
.s 汇编语言源程序;汇编
.S 汇编语言源程序;预处理,汇编
.h 预处理器文件;通常不出现在命令行上

其他后缀名的文件被传递给连接器
.o 目标文件
.a 归档库文件

 

总体选项
使用方法:gcc/g++ [option] <filename>..

这里先介绍一下option中的一些参数
-c
编译或汇编源文件,但是不作连接,编译器输出对应于源文件的目标文件
缺省情况下GCC/G++在-c后会产生一个目标文件(-o),替换源文件名后缀为".c,.i,.s"等,产生目标文件名。可以使用-o来选择其他名字
-S
编译后即停止,不进行汇编,对于每个输入的非汇编语言文件,输出文件是汇编语言文件。
缺省情况下,通过用.o规制源文件后缀'.c,.i'等,产生目标名。可以使用-o选项选择其他名字
-E
预处理后即停止,不进行编译。预处理后的代码送往标准输出
GCC忽略任何不需要预处理的输入文件。
-o file
指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码
由于只能指定一个输出文件,因些编译多个输入文件时,使用'-o'选项没有意义,除非输出一个可执行文件。
如果没有使用'-o'选项伯输出结果是:可执行文件为'a.out',
-v
显示执行编译阶段的命令。同时显示编译器驱动程序,预处理器,编译器的版本号,也可以产生一个可执行程序

预处理器选项:
这些选项要和-E一起使用才有效
-M[-MG]
告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个源文件,预处理器输出一个make规则,
该规则的目标项target是源文件对应的目标文件名,依赖项是源文件中"#include"引用的所有文件。生成的规则可以是单行,
但如果太长,就用'/'换行符续成多行。规则显示在标准输出,不产生预处理过的C程序。

-MM [-MG]
和'-M'选项类似,但是输出结果仅涉及用户头文件,像这样“#include file”.忽略系统头文件发'#include <file>'.

连接器选项:
下面的选项用于编译器连接目标文件,输出可执行文件的时候,如果编译器不进行连接,他们就毫无意义。
-l<library>
(没有空格)连接名为library的库文件
连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是'liblibrary.a'.连接器会当做文件名得到准确说明一样引用这个文件
搜索目录除了一些系统标准目录外,还可以包括用户以'-L'选项指定的路径
一般说来用这个方法找到的文件是库文件,连接器处理归档文件的方法是:
扫描归档文件,寻找某些成员,这些的符号目前已被引用,不过还没有被定义。但是,如果连接器找到普通的
目标文件,而不是库文件,就把这个目标文件按平常方式连接进来。指定‘-l'选项和指定名的唯一区别是,'-l'选项
用'lib'和'.a'把library包裹起来,而且搜索一些目录

目录选项:
下列选项指定搜索路径,用于查找头文件夹,库文件,或编译器的某些成员
-Idir
在文件的搜索路径列表中添加dir目录

-I-
任何在'-I-'前面用'-I'选项指定的搜索路径只适用于'#include "file" 这种情况;他们不能用来搜索“#include <filename>”包含的头文件夹

如果用`-I'选项指定的搜索路径位于`-I-'选项后面,就可以在这些路径中搜索所有的 `#include'指令. (一般说来-I选项就是这么用的.)

还有, `-I-'选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"'的第一选择.没有办法克服`-I-'选项的这个效应.你可以指定 `-I.'搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常 令人满意.

`-I-'不影响使用系统标准目录,因此, `-I-'和`-nostdinc'是不同的选项.


 

原创粉丝点击