C语言程序makefile编译过程

2022-0111 blog_010
makefile是一些大型linux下开发的项目经常会用到的编译脚本;
可以将makefile理解为类似shell一样的脚本语言,他也有自己的语法规则,注释,可以定义变量等;

下面通过一个简单的例子来看C语言程序的编译过程

  1. 准备一个linux系统,比如ubuntu
  2. 编辑一个C语言的源码文件,例如下面的main.c
#include <stdio.h>#define STR      "abcdef"
#define PRI     printfint main(void)
{PRI("%s\n", STR);return 0;
}
  1. linux命令终端执行:touch makefile 或者 touch Makefile
    创建一个makefile文件
  2. 输入一下makefile内容
# this is a comment in makefile
# 4
main : main.ogcc main.o -o main# 3
main.o : main.sgcc -c main.s -o main.o# 2
main.s : main.igcc -S main.i -o main.s# 1
main.i : main.cgcc -E main.c -o main.i# make clean rules
.PHONY : clean
clean :rm main.i main.S main.o main
  1. linux命令终端执行:make,即可编译
  2. linux命令终端执行:./main,运行生成的目标文件,查看运行结果
  3. linux命令终端执行:ls, 即可查看make命令编译生成的文件
  4. 注意下顺序,如果倒过来1234,make的时候只会执行一句

C语言程序编译的过程:
C/C++ 这样的属于高级编程语言,编译的方向是:

高级语言(工程师编写的代码)->汇编语言->机器语言(二进制文件)

那么现在回到上面的makefile:

  1. " # " 表示注释,多行注释可在当前行末尾加 " \ "

  2. makefile的一个语法格式:

    目标文件 : 依赖文件
    [Table]命令(注意命令前面必须有Table键值

  3. .PHONY : clean
    这里表示一个伪目标

  4. 调用make clean时,就会执行clean定义的命令:rm main.i main.S main.o main

下面终于进入正题,敲黑板环节

C语言程序的编译过程:

  1. 预处理
    gcc -E main.c -o main.i
  2. 汇编
    gcc -S main.i -o main.s
  3. 编译
    gcc -c main.s -o main.o
  4. 链接
    gcc main.o -o main

关于汇编和编译的理解(仅个人理解)
从文件的目标与依赖关系来看:
1. 预处理依赖.c文件,生成.i文件;
2. 汇编依赖.i文件,生成.s的汇编程序文件;
3. 目标.o文件,依赖于.s文件,将汇编程序编译成二进制.文件o的过程,称为编译
4. 链接二进制文件生成可执行文件

小发现
好像生成的.s汇编文件不需要依赖.i文件,也可以依赖.c文件生成汇编程序文件
如:
gcc -S main.c -o main.s
这就尴尬了。。。

C语言程序makefile编译过程相关推荐

  1. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  2. 飞刀推球搜众神推球:c语言程序的编译过程

    **根据知名球料公中号"众神推球"表明:**经典的Hello World,通常是你的第一个c语言程序: #include<stdio.h> int main() { p ...

  3. Linux下C语言程序的编译过程

    使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) (4)链接:(linking) ...

  4. 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行

    目录 前言 一.使用gcc命令完成编译c语言程序 1.编写c语言程序 main1.c sub1.h sub1.c 2.gcc命令编译 步骤一命令:gcc -c sub1.c作用:将sub1.c程序转换 ...

  5. 理解C语言(零) 导读(上):C程序的编译过程- 机器级表示

    1 从Hello world说起 Hello world是初学者使用任何一项编程语言最基本最简单的程序.下面是一个C语言版的"Helloworld" : #include < ...

  6. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

  7. c语言的详细编译过程

    gcc编译c语言的整个编译过程可分为预编译->编译->汇编->链接 我们先编辑一个name.c文件 1 # include<stdio.h> 2 int main(int ...

  8. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  9. WPF 程序的编译过程

    基于 Sdk 的项目进行编译的时候,会使用 Sdk 中附带的 props 文件和 targets 文件对项目进行编译.Microsoft.NET.Sdk.WindowsDesktop 的 Sdk 包含 ...

最新文章

  1. 数据库基础笔记(MySQL)3 —— 基础操作
  2. 「时事点评」我有一个预感,保时捷女车主丈夫要残了!
  3. 交换排序 —— 快速排序
  4. Python生成器的用法,使用生成器灵活的生成斐波那契数列
  5. SQL Server 2008如何创建定期自动备份任务
  6. 【❤️万字长文总结❤️】一篇学会Redis高可用✔集群✔搭建详细教程
  7. 简单的识别猫狗的模型
  8. Mysql 使用sql语句快速复制表和数据
  9. 我的世界java版联机不稳定_我的世界:你一定不会相信,时隔2年,网易这次真的“更新”了...
  10. 转:标准C++中的string类的用法总结
  11. 大数据分析,在中国找个身高1米7年入20万的老公,到底有多难?
  12. win7 mac虚拟机linux,Mac虚拟机parallels desktop超详细安装Win7图文分解
  13. 华为网络设备-OSPF路由实验
  14. android 支付宝参数说明,android 支付宝 接入流程总结
  15. Unity il2cpp LinuxInterop_dlopen Error
  16. ProSpec Persephin小鼠重组体解决方案
  17. 打开Windows自带的画图工具
  18. 系统架构设计基础(一)
  19. 一款免费的Veracrypt加密软件---U盘加密功能
  20. 大数据技能修炼的个人道场

热门文章

  1. win10删除休眠文件hiberfil.sys
  2. JVM即时编译(JIT)
  3. Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
  4. mysql 列换行 表设计 设计_mysql 列转行的技巧(分享)
  5. matlab 遗传算法求解多式联运优化——可考虑中转次数约束、满意度最高和成本最优方案
  6. JS 验证码倒计时效果
  7. ETF定投数据分析5——蒙特卡洛算法
  8. 理解马哲的辩证法和认识论
  9. 克莱斯勒召回1604辆牧马人,涉及高压电池保险丝存在安全隐患
  10. 机器学习强基计划4-5:详解半朴素贝叶斯分类TAN原理(附Python实现)