[Linux]Linux编译器gcc/g++

首先我们需要明确概念gcc只能用来编译c语言,g++即可用来编译c语言,又可用来编译c++,但我们一般用gcc编译c,g++编译c++

一、gcc的使用

当我们写好代码以后可以直接

gcc test.c

然后它会自动生成一个可执行程序a.out这个可执行程序的名字不重要,关键是它的属性具有可执行权限

然后我们直接使用如下命令,就可以进行运行了

./a.out

二.g++的使用

g++的使用与gcc是十分类似的

不过我们需要先安装一下g++

yum install gcc gcc-c++

安装以后,我们就可以使用g++编译c++代码了,它默认生成的就是a.out文件

三、gcc编译链接过程

我们知道执行一个c程序需要经过一下几个步骤

  • 预处理
  • 编译(生成汇编)
  • 汇编(生成机器可识别代码)
  • 链接(生成可执行文件或库文件)

1.预处理

在预处理过程中,会有如下操作

  1. 去掉注释
  2. 头文件展开
  3. 宏替换
  4. 条件编译

我们先来展示前三点

我们需要先输入如下指令

gcc -E test.c -o test.i

“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

这里,我们还需要了解的一点是,我们为什么可以在windows或者linux上进行C/C++或者其他形式的开发呢?

这是因为我们的系统中一定要提前或者后序安装上,C/C++开发相关的头文件,库文件

而这些文件就在下面的路径中

/usr/include

​

然后我们可以打开一下比如stdio.h

而我们前面的头文件展开,就是将这里面的内容全部拷贝到test.i中

其实我们在安装vs2022的时候,还在安装的时候,就要选择对应的开发包,同步也在下载C的头文件和库文件也就是说,在windows也同步有着对应的文件

还有条件编译,也会在预处理阶段给解决掉

gcc -E test.c -o test.i

不过对于宏,我们也可以在编译时候去定义的

gcc -E test.c -o test.i -DDEBUG

而条件编译的作用就是

比如vs2022有社区版和专业版,而公司不可能会专门维护两份代码,所以社区版只是专业版裁剪掉了某些功能得到的,而这个裁剪用的就是条件编译.

2.编译(生成汇编)

在我们与预处理完以后,我们的代码其实还是C语言

所以我们下一步就是生成汇编

gcc -S test.i -o test.s

不过我们也可以从test.c直接生成汇编

gcc -S test.c -o test.s

生成以后就是这样的:

在这个阶段中,gcc 会检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言

3.汇编(生成机器可识别代码)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件

  • 在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

下一步

gcc -c test.s -o test.o

不过这次打开,我们看到的将会是这样的:

一片乱码,这是因为这个.o文件是二进制文件,而vim是文本编辑器。所以我们可以使用二进制查看工具比如od:

我们运行:

od test.o

4..链接(生成可执行文件或库文件)

我们直接将所有的目标文件进行链接起来即可

gcc test.o -o atest


最终这个atest就是我们的可执行文件,此处顺便附上运行结果

以下我会列举可执行程序的生成方式:

1.直接生成

gcc test.c

 这种方式最终生成的可执行程序是a.out

2.

gcc test.c -o test

这种方式就和前面比较相似,直接将.c文件变成一个可执行程序test

不过也可以这样写,反正记住无论如何-o后面跟的永远都是最终的可执行程序

gcc -o test test.c

相关推荐

  1. gc和gccgo编译器

    2024-07-19 02:28:02       27 阅读
  2. 【Linux】GCC编译器(七)

    2024-07-19 02:28:02       34 阅读
  3. GUN编译器gcc/g++)- 编译过程

    2024-07-19 02:28:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 02:28:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 02:28:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 02:28:02       58 阅读
  4. Python语言-面向对象

    2024-07-19 02:28:02       69 阅读

热门阅读

  1. 软件测试有光明的未来

    2024-07-19 02:28:02       20 阅读
  2. 1、PostgreSQL安装

    2024-07-19 02:28:02       20 阅读
  3. 数组reduce的众多用法

    2024-07-19 02:28:02       21 阅读
  4. 泛型+反射

    2024-07-19 02:28:02       18 阅读
  5. 牛客周赛51

    2024-07-19 02:28:02       22 阅读
  6. 开始构建我们自己的大语言模型:数据处理部分

    2024-07-19 02:28:02       21 阅读
  7. Vue.js(第一天)

    2024-07-19 02:28:02       21 阅读
  8. ThreadPoolExecutor拒绝策略

    2024-07-19 02:28:02       23 阅读
  9. Redis 散列

    2024-07-19 02:28:02       17 阅读
  10. C# —— HashTable

    2024-07-19 02:28:02       21 阅读
  11. 4 Ajax

    2024-07-19 02:28:02       19 阅读
  12. GNU/Linux - U-BOOT的GPIO command

    2024-07-19 02:28:02       18 阅读
  13. 一篇文章帮你彻底搞懂剩余运算符!!

    2024-07-19 02:28:02       19 阅读
  14. selenium 之 css定位

    2024-07-19 02:28:02       21 阅读