gcc安装与使用
一、功能
GCC 是 Linux 下的编译工具集,是 GNU Compiler Collection 的缩写,包含 gcc、g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar、nm 等。GCC不仅可以用于编译源文件,也可以用来制作静态库与动态库。
GCC 工具集不仅能编译 C/C++ 语言,其他例如 Objective-C、Pascal、Fortran、Java、Ada 等语言均能进行编译。GCC 在可以根据不同的硬件平台进行编译,即能进行交叉编译,在 A 平台上编译 B 平台的程序,支持常见的 X86、ARM、PowerPC、mips 等,以及 Linux、Windows 等软件平台。
二、安装gcc
有些纯净版的 Linux 默认没有 gcc 编译器,需要自己安装,在线安装步骤如下:
# 安装软件必须要有管理员权限
# ubuntu
$ sudo apt update # 更新本地的软件下载列表, 得到最新的下载地址
$ sudo apt install gcc g++ # 通过下载列表中提供的地址下载安装包, 并安装
# centos
$ sudo yum update # 更新本地的软件下载列表, 得到最新的下载地址
$ sudo yum install gcc g++ # 通过下载列表中提供的地址下载安装包, 并安装
gcc 安装完毕之后,可以查看版本:
# 查看 gcc 版本
$ gcc -v
$ gcc --version
# 查看 g++ 版本
$ g++ -v
$ g++ --version
三、gcc 工作流程
GCC 编译器对程序的编译下图所示,分为 4 个阶段:预处理(预编译)、编译和优化、汇编和链接。GCC 的编译器可以将这 4 个步骤合并成一个。 (编译.c文件用gcc,编译.cpp格式的c++源文件用g++)
1. 预处理:在这个阶段主要做了三件事: 展开头文件 、宏替换 、去掉注释行
这个阶段需要 GCC 调用预处理器来完成,最终得到的还是源文件,文本格式
2. 编译:这个阶段需要 GCC 调用编译器对文件进行编译,最终得到一个汇编文件
3. 汇编:这个阶段需要 GCC 调用汇编器对文件进行汇编,最终得到一个二进制文件
4. 链接:这个阶段需要 GCC 调用链接器对程序需要调用的库进行链接,最终得到一个可执行的二进制文件
文件名后缀 | 说明 | gcc 参数 |
---|---|---|
.c | 源文件 | 无 |
.i | 预处理后的 C 文件 | -E |
.s | 编译之后得到的汇编语言的源文件 | -S |
.o | 汇编后得到的二进制文件 | -C |
在 Linux 下使用 GCC 编译器编译单个文件十分简单,直接使用 gcc 命令后面加上要编译的 C 语言的源文件,GCC 会自动生成文件名为 a.out 的可执行文件(也可以通过参数-o指定生成的文件名),也就是通过一个简单的命令上边提到的 4 个步骤就全部执行完毕了。但是如果想要单步执行也是没问题的。一步完成上述操作的示例如下
:
// 假设程序对应的源文件名为 test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
int array[5] = {
1,2,3,4,5};
for(int i=0; i<5; ++i)
{
printf("array[%d] = %d\n", i, array[i]);
}
return 0;
}
此时可使用命令:
gcc test.c -o test1 // -o可以不指定,则会生成一个a.out的可执行文件
此时,目录中就会有一个名为test1的可执行文件(绿色)。
四、gcc 常用参数
下面的表格中列出了常用的一些 gcc 参数,这些参数在 gcc命令中没有位置要求,只需要编译程序的时候将需要的参数指定出来即可。
其中,-I(大写i)指定头文件所在位置。参数与指定值之间有没有空格均可。
详细参数示例见:Linux代码编译与运行
五、gcc与g++
区别:
1. 在代码编译阶段(第二个阶段):
- 后缀为 .c 的,gcc 把它当作是 C 程序,而 g++ 当作是 C++ 程序
- 后缀为.cpp 的,两者都会认为是 C++ 程序,C++ 的语法规则更加严谨一些
- g++ 会调用 gcc,对于 C++ 代码,两者是等价的,也就是说 gcc 和 g++ 都可以编译 C/C++ 代码
2. 在链接阶段(最后一个阶段):
- gcc 和 g++ 都可以自动链接到标准 C 库
- g++ 可以自动链接到标准 C++ 库,gcc 如果要链接到标准 C++ 库需要加参数 -lstdc++
3. 关于 __cplusplus 宏的定义
- g++ 会自动定义__cplusplus 宏,但是这个不影响它去编译 C 程序
- gcc 需要根据文件后缀判断是否需要定义 __cplusplus 宏 (规则参考第一条)
综上所述:
不管是 gcc 还是 g++ 都可以编译 C 程序,编译程序的规则和参数都相同。g++ 可以直接编译 C++ 程序, gcc 编译 C++ 程序需要添加额外参数 -lstdc++不管是 gcc 还是 g++ 都可以定义 __cplusplus 宏。