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 包含 ...
最新文章
- 1051 Pop Sequence(两种双指针思路)
- 【Android 插件化】DroidPlugin 编译运行 ( DroidPlugin 简介 | 编译 DroidPlugin 官方示例 | 运行 DroidPlugin 官方示例 )
- SD-WAN的四个价值—Vecloud微云
- 【学习笔记】Python - tkinter
- 国内Python最有钱途的方向,开发第二,它排第一!
- Laravel Eloquent关联模型查询设置查询条件与指定字段
- visual studio installer可以卸载吗_技术帖 | 这些宝藏软件你安装了吗?
- 华尔街英语学习软件_华尔街英语吧啦吧啦聊点啥:语言学习交流至上
- ubuntu16.04安装mongodb
- Java的深拷贝 vs 浅拷贝
- wincc中c语言做变量自增,在WinCC中如何利用C动作实现变量自动加1-工业支持中心-西门子中国...
- React报错 React Hook useEffect has a missing dependency: ‘obj‘
- Linux磁盘分区(fdisk)及磁盘限额(quota)
- windows电脑上架app store的软件
- cogs 313. [POI2001] 和平委员会(2-SAT
- 微信浏览器 打开zip文件_愚蠢的怪胎技巧:使用7-Zip作为快速的文件浏览器
- 树莓派入门(十) 树莓派系统升级
- html音频base64编码,录音文件与Base64编码相互转换的方法
- 双十一PPT模板推荐
- UR机械臂学习(5-2):使用Universal_Robots_ROS_Driver驱动真实机械臂
热门文章
- verilog语法学习_2.时序控制(延时控制 时间控制)
- Android弹幕实现:基于B站弹幕开源系统(3)-文本弹幕的完善和细节调整
- Xshell / Xftp 7 暴力激活
- 新破天一剑一直显示服务器连接失败,新破天一剑为什么我这新破天一剑更新完了.不 – 手机爱问...
- html新闻排版制作代码,在DIV+CSS排版中新闻列表的制作方法_CSS/HTML
- MBA案例分析(行销与营销之行销一)
- .net 里可以轻松对图片文件进行质量压缩
- 电竞陪玩app定制开发业务是怎样满足市场需求的?
- 编辑PDF的多级书签
- RK3588去掉锁屏设置永不灭屏