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. 1051 Pop Sequence(两种双指针思路)
  2. 【Android 插件化】DroidPlugin 编译运行 ( DroidPlugin 简介 | 编译 DroidPlugin 官方示例 | 运行 DroidPlugin 官方示例 )
  3. SD-WAN的四个价值—Vecloud微云
  4. 【学习笔记】Python - tkinter
  5. 国内Python最有钱途的方向,开发第二,它排第一!
  6. Laravel Eloquent关联模型查询设置查询条件与指定字段
  7. visual studio installer可以卸载吗_技术帖 | 这些宝藏软件你安装了吗?
  8. 华尔街英语学习软件_华尔街英语吧啦吧啦聊点啥:语言学习交流至上
  9. ubuntu16.04安装mongodb
  10. Java的深拷贝 vs 浅拷贝
  11. wincc中c语言做变量自增,在WinCC中如何利用C动作实现变量自动加1-工业支持中心-西门子中国...
  12. React报错 React Hook useEffect has a missing dependency: ‘obj‘
  13. Linux磁盘分区(fdisk)及磁盘限额(quota)
  14. windows电脑上架app store的软件
  15. cogs 313. [POI2001] 和平委员会(2-SAT
  16. 微信浏览器 打开zip文件_愚蠢的怪胎技巧:使用7-Zip作为快速的文件浏览器
  17. 树莓派入门(十) 树莓派系统升级
  18. html音频base64编码,录音文件与Base64编码相互转换的方法
  19. 双十一PPT模板推荐
  20. UR机械臂学习(5-2):使用Universal_Robots_ROS_Driver驱动真实机械臂

热门文章

  1. verilog语法学习_2.时序控制(延时控制 时间控制)
  2. Android弹幕实现:基于B站弹幕开源系统(3)-文本弹幕的完善和细节调整
  3. Xshell / Xftp 7 暴力激活
  4. 新破天一剑一直显示服务器连接失败,新破天一剑为什么我这新破天一剑更新完了.不 – 手机爱问...
  5. html新闻排版制作代码,在DIV+CSS排版中新闻列表的制作方法_CSS/HTML
  6. MBA案例分析(行销与营销之行销一)
  7. .net 里可以轻松对图片文件进行质量压缩
  8. 电竞陪玩app定制开发业务是怎样满足市场需求的?
  9. 编辑PDF的多级书签
  10. RK3588去掉锁屏设置永不灭屏