【Linux_gcc/g++】Linux编译器 - gcc/g++使用

一、概念

1. GCC

GCC(GNU Compiler Collection)是一个由GNU开发的编译器套件,支持多种编程语言,如C、C++、Objective-C、Fortran、Ada等。GCC是一个开源的编译器,被广泛用于许多操作系统和平台上。

2. gcc

gccGCC 编译器套件中用于编译 C 语言程序的特定前端程序。当人们提到 "gcc" 时,通常是指使用 GCC 编译器套件中的 C 编译器。

  • gccGNU 编译器集合中的 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++ 的区别

  1. 对于 .c.cpp 文件,gcc 分别当做 ccpp 文件编译( ccpp 的语法强度是不一样的)。

  2. 对于 .c.cpp 文件,g++ 则统一当做 cpp 文件编译。

  3. 使用 g++ 编译文件时,g++ 会自动链接标准库STL,而 gcc 不会自动链接 STL

  4. gcc 在编译 C 文件时,可使用的预定义宏是比较少的。

  5. gcc 在编译 cpp 文件时/ g++ 在编译 c 文件和 cpp 文件时(这时候 gccg++ 调用的都是 cpp 文件的编译器),会加入一些额外的宏。

  6. 在用 gcc 编译 c++ 文件时,为了能够使用 STL ,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++g++ 等价,它们的区别不仅仅是这个。

Tips:编译 c 文件就用 gcc 编译器;编译 cpp 文件就用 g++ 编译器。

二、gcc/g++ 的使用

由于 gccg++ 的选项基本上都是一样的,本文就重点以 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 文件:
在这里插入图片描述
至此文件编译链接的基本指令已经结束。

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自然语言编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值