当前位置: 首页 > ds >正文

【Linux系统】gcc编译器的使用

文章目录

  • 一、C程序编译的过程
  • 二、gcc编译C程序
    • 1.一步到位(直接从c程序文件到可执行程序)
    • 2.分步骤拆解(预处理—>编译—>汇编—>链接)
      • 2.1 预处理
      • 2.2 编译
      • 2.3 汇编
      • 2.4 链接


一、C程序编译的过程

  1. 预处理(进行宏替换/去注释/条件编译/头文件展开等)
  • 预处理指令是以#号开头的代码行。
  • 头文件展开是指:把头文件中的相关内容直接拷贝到源文件中(所以预处理完毕后就不需要用到头文件了)
  • 预处理后的文件以 “.i”为后缀。
  1. 编译(生成汇编代码)
  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
  • 编译后的文件以 “.s”为后缀
  1. 汇编(生成机器可识别代码)
  • 在这个阶段中,gcc 把汇编代码转化为二进制代码目标文件
  • 汇编后的文件以 “.o”为后缀。
  1. 链接(生成可执行文件或库文件)
  • 链接多个目标文件(至少一个)和 库文件 形成可执行文件

二、gcc编译C程序

1.一步到位(直接从c程序文件到可执行程序)

首先得写一个c程序:

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 4
-rw-rw-r-- 1 zh zh 75 May 10 16:35 code.c
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ vim code.c

在这里插入图片描述

  1. gcc c程序(对c程序进行编译生成名为 a.out 的可执行程序)
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ gcc code.c
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 16
-rwxrwxr-x 1 zh zh 8360 May 10 16:54 a.out
-rw-rw-r-- 1 zh zh   75 May 10 16:35 code.c
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ./a.out
hello world

  1. gcc c程序 -o 指定生成的文件名(对c程序进行编译生成指定文件名的可执行程序)
    或 gcc -o 指定生成的文件名 c程序(两种写法都能达到同样效果)
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 4
-rw-rw-r-- 1 zh zh 75 May 10 16:35 code.c
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ gcc code.c -o code
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 16
-rwxrwxr-x 1 zh zh 8360 May 10 16:58 code
-rw-rw-r-- 1 zh zh   75 May 10 16:35 code.c
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ./code
hello world

2.分步骤拆解(预处理—>编译—>汇编—>链接)

2.1 预处理

gcc -E c文件 -o 生成的文件
(-E 的作用:开始进行c程序的翻译,当预处理阶段完毕后翻译就停止)

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 4
-rw-rw-r-- 1 zh zh 75 May 10 16:35 code.c
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ gcc -E code.c -o code.i 
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 24
-rw-rw-r-- 1 zh zh    75 May 10 16:35 code.c
-rw-rw-r-- 1 zh zh 16872 May 10 17:11 code.i

我们怎么知道生成的 code.i 到底是不是c程序预处理后的文件,打开看看就知道了:

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ vim code.i

在这里插入图片描述
发现 code.i 文件竟然变成足足843行,这就是预处理过程中头文件<stdio.h>展开的作用;而且 code.i 文件仍然是c代码,证明还没经过 编译阶段;种种迹象表明 code.i 就是 code.c 只经过预处理后的文件

2.2 编译

gcc -S c文件/预处理后的c文件 -o 生成的文件
(-S 的作用:开始进行c程序的翻译,当编译阶段完毕后翻译就停止)

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 24
-rw-rw-r-- 1 zh zh    75 May 10 16:35 code.c
-rw-rw-r-- 1 zh zh 16872 May 10 17:11 code.i
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ gcc -S code.i -o code.s
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 28
-rw-rw-r-- 1 zh zh    75 May 10 16:35 code.c
-rw-rw-r-- 1 zh zh 16872 May 10 17:11 code.i
-rw-rw-r-- 1 zh zh   447 May 10 19:38 code.s

打开 code.s 文件观察:

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ vim code.s

在这里插入图片描述
code.s 文件中的内容是汇编代码,表明 code.s 是 c程序 经过编译阶段后的文件

2.3 汇编

(1)gcc -c c文件/预处理后的c文件/编译后的c文件 -o 生成的文件
(-c 的作用:开始进行c程序的翻译,当汇编阶段完毕后翻译就停止)
(2)gcc -c c文件/预处理后的c文件/编译后的c文件
(汇编后自动生成以 .o 为后缀的同名文件)

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 28
-rw-rw-r-- 1 zh zh    75 May 10 16:35 code.c
-rw-rw-r-- 1 zh zh 16872 May 10 17:11 code.i
-rw-rw-r-- 1 zh zh   447 May 10 19:38 code.s
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ gcc -c code.s -o code.o
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 32
-rw-rw-r-- 1 zh zh    75 May 10 16:35 code.c
-rw-rw-r-- 1 zh zh 16872 May 10 17:11 code.i
-rw-rw-r-- 1 zh zh  1496 May 10 19:45 code.o
-rw-rw-r-- 1 zh zh   447 May 10 19:38 code.s

打开 code.o 文件观察:

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ vim code.o

在这里插入图片描述
code.o 文件中的内容全是乱码,实际上就是二进制代码,二进制文件得使用专门的方式查看,否则看到得就是乱码。这表明 code.o 是 c程序 经过汇编阶段后的文件

2.4 链接

gcc c文件/预处理后的c文件/编译后的c文件/汇编后的c文件 -o 生成的文件

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 32
-rw-rw-r-- 1 zh zh    75 May 10 16:35 code.c
-rw-rw-r-- 1 zh zh 16872 May 10 17:11 code.i
-rw-rw-r-- 1 zh zh  1496 May 10 19:45 code.o
-rw-rw-r-- 1 zh zh   447 May 10 19:38 code.s
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ gcc code.o -o code.exe
[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ls -l
total 44
-rw-rw-r-- 1 zh zh    75 May 10 16:35 code.c
-rwxrwxr-x 1 zh zh  8360 May 10 20:10 code.exe
-rw-rw-r-- 1 zh zh 16872 May 10 17:11 code.i
-rw-rw-r-- 1 zh zh  1496 May 10 19:45 code.o
-rw-rw-r-- 1 zh zh   447 May 10 19:38 code.s

链接后形成可执行文件,可以直接运行:

[zh@iZbp1dr1jtgcuih41mw88oZ ~]$ ./code.exe
hello world

http://www.xdnf.cn/news/7793.html

相关文章:

  • Woocommerce 热卖产品不起作用
  • 飞桨paddle import fluid报错【已解决】
  • 模糊照片变清晰:照片高清修复 ComfyUI 使用教学
  • 2.10 财务分析
  • 活体检测接口全面评测:2025年活体检测选择指南
  • conda 设置env后,环境还是安装在c盘的解决方式:
  • LLM应用开发平台资料
  • python使用yolo训练模型
  • 【YOLOs-CPP-图像分类部署】01-构建项目
  • Python异步编程详解
  • Hive drop column 的解决方法
  • 第二届帕鲁杯时空交织的密语
  • AUTOSAR图解==>AUTOSAR_SRS_SecureOnboardCommunication
  • 大模型的开发应用(三):基于LlaMAFactory的LoRA微调(上)
  • VMware三种网络配置对比
  • Cow Ski Area G---二维图转一维+tarjan缩点
  • 嵌入式学习笔记 D24 :系统编程之i/o操作
  • 解决 Incorrect username or password (access token)
  • 数据库错误解决指南:从诊断到修复的全流程攻略
  • 04 接口自动化-框架封装思想建立之httprunner框架(上)
  • Fiddler 指定链接断点
  • nettrace工具介绍
  • GraphPad Prism工作表的管理
  • Baumer工业相机堡盟工业相机的工业视觉如何对高反光圆柱体生产日期进行识别检测
  • 8.MySQL故障排查与生产环境优化
  • 铸铁平台:承载千斤重担的工业基石
  • 视觉语言模型之困:当否定词成为理解的“盲区”
  • 挖o心得(2)
  • TYUT-企业级开发教程-第6章
  • CUMT-教务系统登录功能实现