GCC程序编译
linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作之一。GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一般的编译器相比,平均效率要高20%~30%。
GCC编译程序的四个阶段
- 预处理(Pre-Processing):编译器将C程序的头文件编译进来,还有完成宏的替换。
- 编译(Compiling):这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无误后,将程序编译成汇编语言。
- 汇编(Assembling):将汇编程序翻译成机器语言,也就是二进制程序。
- 链接(Linking):链接头文件中的函数所对应的函数库。例如:printf函数在stdio.h头文件中只是完成声明,要实现printf函数的功能,还需要链接到实际实现代码中去。
GCC通过后缀来区分输入文件的类别
.c |
C语言源代码文件 |
.a |
是由目标文件构成的库文件 |
.C,.cc或.cxx |
C++源代码文件 |
.h |
头文件 |
.i |
已预处理过的C源代码文件 |
.ii |
已预处理过的C++源代码文件 |
.o |
编译后的目标文件 |
.s |
汇编语言源代码文件 |
.S |
经过预编译的汇编语言源代码文件 |
GCC用法
gcc [options] [filenames]
options : 编译器所需要的编译选项
filenames : 要编译的文件名
编译选项
-o output_filename : 确定可执行文件的名称,如果不添加该选项,则给出默认执行文件xxx.out
-c : 只编译,不链接成为可执行文件,生成.o目标文件
-g : 产生调试工具(GNU的GDB)所必要的调试信息
-O : 对程序进行优化编译、链接,产生的可执行文件的执行效率可以提高,但是编译、链接速度会降低
-O2 : 比-O更好的优化编译、链接
-I dirname : 将dirname所指出的目录加入到程序头文件目录列表中
C程序中的头文件包含两种情况:
#include <A.h>
#include "B.h"
对于<>,预处理程序cpp在系统预设的头文件目录中搜寻相应的文件
对于"",cpp在当前目录中搜寻头文件,如果添加-I选项,并且在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。
-L dirname : 将dirname所指定的目录加入到库文件的目录列表中。在默认情况下,连接程序ld在系统的预设路径中(/user/lib)寻找所需要的库文件,这个选项告诉链接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。
-lname : 在连接时,装载名字为libname.a的函数库,该函数库的目录可以是系统预设或者由-L选项指定。
-static : 静态链接库文件。当使用静态库时,链接器找出程序所需的函数,然后将它们拷贝到可执行文件中,此后将不需要静态程序库,但是静态链接占用空间大,所以linux下进行链接的缺省操作是链接动态库。
-Wall : 生成所有警告信息
-w : 不生成任何警告信息
-DMACRO : 定义MACRO宏,等效于在程序中使用#define MACRO