目录
一、概念
1. GCC
GCC(GNU Compiler Collection)是一个由GNU开发的编译器套件,支持多种编程语言,如C、C++、Objective-C、Fortran、Ada等。GCC是一个开源的编译器,被广泛用于许多操作系统和平台上。
2. gcc
gcc
是 GCC
编译器套件中用于编译 C
语言程序的特定前端程序。当人们提到 "gcc"
时,通常是指使用 GCC
编译器套件中的 C
编译器。
gcc
是GNU
编译器集合中的C
语言编译器。- 支持多种
C
语言标准(如 ANSI C、ISO C89、ISO C99)以及一些扩展特性。gcc
可以将C
语言源代码编译成可执行文件,或者生成汇编代码和目标文件。
3. g++
g++
是 GCC
编译器套件中专门用于编译 C++
程序的前端程序的名称。g++
实际上是 GCC
中专门用于处理 C++
代码的前端程序。
g++
是GNU
编译器集合中的C++
语言编译器。- 它在
gcc
的基础上添加了对C++
语言的支持,包括标准C++
和一些扩展特性。g++
可以将C++
源代码编译成可执行文件,或者生成汇编代码和目标文件。
4. gcc 和 g++ 的区别
-
对于
.c
和.cpp
文件,gcc
分别当做c
和cpp
文件编译(c
和cpp
的语法强度是不一样的)。 -
对于
.c
和.cpp
文件,g++
则统一当做cpp
文件编译。 -
使用
g++
编译文件时,g++
会自动链接标准库STL
,而gcc
不会自动链接STL
。 -
gcc
在编译C
文件时,可使用的预定义宏是比较少的。 -
gcc
在编译cpp
文件时/g++
在编译c
文件和cpp
文件时(这时候gcc
和g++
调用的都是cpp
文件的编译器),会加入一些额外的宏。 -
在用
gcc
编译c++
文件时,为了能够使用STL
,需要加参数–lstdc++
,但这并不代表gcc –lstdc++
和g++
等价,它们的区别不仅仅是这个。
Tips:编译 c
文件就用 gcc
编译器;编译 cpp
文件就用 g++
编译器。
二、gcc/g++ 的使用
由于 gcc
和 g++
的选项基本上都是一样的,本文就重点以 gcc
为例来进行讲解。
1. 预处理(gcc/g++ -E 依赖文件名 -o 目标文件名)
预处理:预处理过程是编译过程中的第一个阶段,主要工作是对源代码进行预处理,生成经过预处理的中间代码。其主要工作内容如下:
Linux下指令:gcc/g++ -E 依赖文件名 -o 目标文件名
具体示例:
现在对当前工作目录下的 test.c
文件执行预处理操作,具体指令如下图:
查看生成的 test.i
文件:
这里可以看出在预处理过程中,编译器进行了头文件展开、注释删除等一系列操作。
代码变化:C
代码 → C
代码
2. 编译(gcc/g++ -S 依赖文件名 -o 目标文件名)
编译过程是在预处理之后的阶段,主要工作是将经过预处理的源代码转换为目标机器的可执行代码。编译过程主要包括以下几个过程:
Linux下指令:gcc/g++ -S 依赖文件名 -o 目标文件名
现在对当前工作目录下的 test.i
文件执行编译操作,具体指令如下图:
查看生成的 test.s
文件:
从这里可以看出,编译器将之前的高级语言代码翻译成了现在的汇编语言代码。
3. 汇编(gcc/g++ -c 依赖文件名 -o 目标文件名)
汇编过程是编译器的最后一个阶段,主要工作是将编译器生成的目标代码(通常是汇编代码)翻译成机器指令,以便计算机能够执行。汇编过程主要包括以下几个主要过程:
Linux下指令:gcc/g++ -c 依赖文件名 -o 目标文件名
现在对当前工作目录下的 test.s
文件执行编译操作,具体指令如下图:
查看生成的 test.o
文件:
从这里可以看出,编译器将之前的汇编代码翻译成了现在的二进制文件。同时,现在的二进制文件是不可被执行的。
4. 链接(gcc/g++ 依赖文件名 -o 目标文件名)
编译器的链接过程是编译器的最后一个阶段,用于将多个目标文件(object files)和库文件链接在一起,生成最终的可执行文件。链接过程主要包括以下几个主要工作:
Linux下指令:gcc/g++ 依赖文件名 -o 目标文件名
现在对当前工作目录下的 test.o
文件执行编译操作,具体指令如下图:
执行生成的 test
文件:
至此文件编译链接的基本指令已经结束。