gcc安装与使用

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 宏。

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值