C语言程序makefile编译过程
C语言程序makefile编译过程
2022-0111 blog_010
makefile是一些大型linux下开发的项目经常会用到的编译脚本;
可以将makefile理解为类似shell一样的脚本语言,他也有自己的语法规则,注释,可以定义变量等;
下面通过一个简单的例子来看C语言程序的编译过程
- 准备一个linux系统,比如ubuntu
- 编辑一个C语言的源码文件,例如下面的main.c
#include <stdio.h>#define STR "abcdef"
#define PRI printfint main(void)
{PRI("%s\n", STR);return 0;
}
- linux命令终端执行:touch makefile 或者 touch Makefile
创建一个makefile文件 - 输入一下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
- linux命令终端执行:make,即可编译
- linux命令终端执行:./main,运行生成的目标文件,查看运行结果
- linux命令终端执行:ls, 即可查看make命令编译生成的文件
- 注意下顺序,如果倒过来1234,make的时候只会执行一句
C语言程序编译的过程:
C/C++ 这样的属于高级编程语言,编译的方向是:
高级语言(工程师编写的代码)->汇编语言->机器语言(二进制文件)
那么现在回到上面的makefile:
" # " 表示注释,多行注释可在当前行末尾加 " \ "
makefile的一个语法格式:
目标文件 : 依赖文件
[Table]命令(注意命令前面必须有Table键值).PHONY : clean
这里表示一个伪目标调用make clean时,就会执行clean定义的命令:rm main.i main.S main.o main
下面终于进入正题,敲黑板环节
C语言程序的编译过程:
- 预处理
gcc -E main.c -o main.i - 汇编
gcc -S main.i -o main.s - 编译
gcc -c main.s -o main.o - 链接
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编译过程相关推荐
- gcc编译c文件_Linux下C语言程序的编译过程
Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...
- 飞刀推球搜众神推球:c语言程序的编译过程
**根据知名球料公中号"众神推球"表明:**经典的Hello World,通常是你的第一个c语言程序: #include<stdio.h> int main() { p ...
- Linux下C语言程序的编译过程
使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) (4)链接:(linking) ...
- 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行
目录 前言 一.使用gcc命令完成编译c语言程序 1.编写c语言程序 main1.c sub1.h sub1.c 2.gcc命令编译 步骤一命令:gcc -c sub1.c作用:将sub1.c程序转换 ...
- 理解C语言(零) 导读(上):C程序的编译过程- 机器级表示
1 从Hello world说起 Hello world是初学者使用任何一项编程语言最基本最简单的程序.下面是一个C语言版的"Helloworld" : #include < ...
- 《编译与反编译技术》—第1章1.7节C语言程序的编译流程
本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...
- c语言的详细编译过程
gcc编译c语言的整个编译过程可分为预编译->编译->汇编->链接 我们先编辑一个name.c文件 1 # include<stdio.h> 2 int main(int ...
- C语言学习笔记---001C语言的介绍,编译过程原理,工具等
C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...
- WPF 程序的编译过程
基于 Sdk 的项目进行编译的时候,会使用 Sdk 中附带的 props 文件和 targets 文件对项目进行编译.Microsoft.NET.Sdk.WindowsDesktop 的 Sdk 包含 ...
最新文章
- 数据库基础笔记(MySQL)3 —— 基础操作
- 「时事点评」我有一个预感,保时捷女车主丈夫要残了!
- 交换排序 —— 快速排序
- Python生成器的用法,使用生成器灵活的生成斐波那契数列
- SQL Server 2008如何创建定期自动备份任务
- 【❤️万字长文总结❤️】一篇学会Redis高可用✔集群✔搭建详细教程
- 简单的识别猫狗的模型
- Mysql 使用sql语句快速复制表和数据
- 我的世界java版联机不稳定_我的世界:你一定不会相信,时隔2年,网易这次真的“更新”了...
- 转:标准C++中的string类的用法总结
- 大数据分析,在中国找个身高1米7年入20万的老公,到底有多难?
- win7 mac虚拟机linux,Mac虚拟机parallels desktop超详细安装Win7图文分解
- 华为网络设备-OSPF路由实验
- android 支付宝参数说明,android 支付宝 接入流程总结
- Unity il2cpp LinuxInterop_dlopen Error
- ProSpec Persephin小鼠重组体解决方案
- 打开Windows自带的画图工具
- 系统架构设计基础(一)
- 一款免费的Veracrypt加密软件---U盘加密功能
- 大数据技能修炼的个人道场
热门文章
- win10删除休眠文件hiberfil.sys
- JVM即时编译(JIT)
- Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
- mysql 列换行 表设计 设计_mysql 列转行的技巧(分享)
- matlab 遗传算法求解多式联运优化——可考虑中转次数约束、满意度最高和成本最优方案
- JS 验证码倒计时效果
- ETF定投数据分析5——蒙特卡洛算法
- 理解马哲的辩证法和认识论
- 克莱斯勒召回1604辆牧马人,涉及高压电池保险丝存在安全隐患
- 机器学习强基计划4-5:详解半朴素贝叶斯分类TAN原理(附Python实现)