gcc是一个工具链(集),是由GNU组织开发的。
该工具链是由binutils,gcc,glibc组成。
binutils是由一组编译,连接,汇编和其他调试目的程序组成。如ar用于生成静态库,size用于列出目标文件的每一段的大小。
gcc是GNU的C与C++的编译器,Linux环境下默认的C语言编译器。
glibc是GNU的C语言标准函数库。该库实行了Linux的系统函数,如open,也实现了标准的C语言库,如fopen。几乎所有的程序都需要与glibc链接。
gcc 编译器能将C,C ++语言源程序、编译成可执行的目标文件。
在 Linux 系统中,可执行的目标文件没有统一的后缀,系统从文件的属性来区分可执行目标文件和不可执行目标文件。
通过file命令可以判断一个文件的属性。
使用gcc编译程序时,编译过程可以被细分为四个阶段:
预处理(Pre-Processing )
编译(Compiling )
汇编(Assembling )
链接(Linking)
gcc 通过文件后缀来区别输入文件的类别:
.c 为后缀的文件:C 语言源代码文件
.a 为后缀的文件:是由目标文件构成的库文件
.C , .cc 或.cxx 为后缀的文件:是 C++源代码文件
.h 为后级的文件:头文件
.i 为后缀的文件:是已经预处理过的 C 源代码文件
.ii 为后缀的文件:是已经预处理过的 C + +源代码文件
.o为后缀的文件:是编译后的目标文件
.s 为后缀的文件:是汇编语言源代码文件
.S 为后级的文件:是经过预编译的汇编语言源代码文件
常规选项-E,-S,-c分别对应预处理,编译,汇编过程。
不加以上3个选项则为链接过程。
-o指定以上4个阶段生成的文件名。
库就是包含了一些通用函数的可执行的程序文件。
库分为动态库与静态库。
静态库一般以libname.a命名。
动态库一般以libname.so[.主版本号.次版本号.发行号]命名。
1 生成目标文件gcc -c -o vv.o vv.c
2 生成静态库ar rcs libstack.a vv.o
3 为静态库制作头文件v.h
4 编译程序gcc -I./ -L./ v.c -lstack
5 运行程序./a.out
动态库编译速度块,运行速度慢,是程序比较小,易于维护。
静态库编译速度慢,运行速度快,但是程序比较臃肿,难于维护。