linux中的‘make’和‘makefile’
在提及‘make’和‘makefile’之前有必要先理清楚程序编译的过程,在windows操作系统下,我们一般使用的编写程序的软件有vs、vc等,这些都是集成软件,当编写完程序之后,直接点击进行编译和链接,那么编译器是怎样将程序进行编译的呢?
◆编译过程
(1)预处理阶段
将程序编辑完成之后,在编译之前,编译器会先对程序进行一下预处理,预处理阶段一般的工作是将程序的注释去掉,将头文件在源文件之中进行展开,同时进行宏替换等操作,经过处理之后就会生成一个.i文件。
(2)编译阶段
将编译的源程序转换为汇编代码,生成.s文件。
(3)汇编阶段
将汇编文件.s转换为计算机能够识别的二进制文件.o文件。
(4)链接阶段
将引用其他的.o文件和二进制文件链接到一块,形成二进制文件.exe。
windows上面的编译环境都是集成化的,程序员可以不用过于在于程序执行的过程,但是在liunx系统中编辑器、编译器、调试器都是分隔开的,我这里使用的编辑器是vim,编译器是gcc,调试器为gdb,这里需要澄清一下make和makefile(也可以为Makefile)的区别?
make和makefile是两个完全不一样的东西,make是一条指令,能够进行程序的编译,而makefile是一个文件,一般可以使用gcc指令进行编译生成许多的目标文件,makefile文件中都是一些编译的指令,当makefile文件写好之后,只需要使用make指令就能够完成编译过程,下面以一个简单的程序介绍一下linux中程序的执行过程:
■编写main.c文件
■编写test.c文件
■编写test.h文件
显而易见,如果想要执行main.c文件就离不开这三个文件,那这三个文件之间存在什么样的关系呢?想要执行程序就需要有main.o、test.o文件,而test.o和main.o文件就需要有test.s和main.s文件,同时main.s和test.s文件又依赖于main.i和test.i文件,而这两个文件又依赖于main.c和test.c文件,编译过程中产生的文件之间都存在这依赖关系,即就是编译的逆过程,下面进行简单的图示:
◆下面是简写的makefile文件:
根据上面的makefile文件,简单的介绍一下makefile文件的执行过程,makefile文件是顺序执行的,执行过程中会按照指令生成对应的目标文件,clean是一个动作的名字,当输入make进行编译时,不会执行clean的内容,如果输入命令make clean的指令,然后就直接跳到clean位置执行clean的内容,将刚才编译时产生的目标文件进行删除,下面是程序执行的过程:
注意:
(1) 如果不想变异的过程中,将执行的编译指令输出,可以在makefile文件中的编译指令前进行添加@字符,即就是@gcc -c test.c ,这样执行的指令就会被隐藏。
(2)makefile中使用的注释符号为‘#’。
(3)clean只是一个动作的名字,它是没有依赖关系的,所以clean的后面只有‘:’,没有其他的文件之类的东西。
转载于:https://blog.51cto.com/10740590/1784991
linux中的‘make’和‘makefile’相关推荐
- 在Linux中制作实用程序(MakeFile)
Hey folks, have you ever used IDEs? Most probably, yes. So what's your favorite one? Geany, CodeBloc ...
- Linux中make工具及makefile文件
一.make工具简介 1.make 工具通过一个称为 makefile 的文件(类似脚本)来完成并自动维护编译工作,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行 ...
- linux增量编译不成功,Linux学习笔记-增量编译(Makefile进一步使用)
增量编译 在VC中就是增量编译! 当某个cpp更新后,只编译这个cpp文件,称为增量编译. 在Linux中,通过控制Makefile实现增量编译的效果 Makefile中使用"依赖depen ...
- Linux学习笔记-增量编译(Makefile进一步使用)
增量编译 在VC中就是增量编译! 当某个cpp更新后,只编译这个cpp文件,称为增量编译. 在Linux中,通过控制Makefile实现增量编译的效果 Makefile中使用"依赖depen ...
- linux未找到make命令,linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法)...
linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法) 发布时间:2020-09-15 04:09:36 来源:脚本之家 阅读:375 ...
- linux make项目管理器,Linux中makefile项目管理
一.整体大纲 二.makefile的编写 一个规则 两个函数 三个变量 1. 一个规则 三要素: 目标, 依赖, 命令 目标:依赖 命令 1) 第一条规则是用来生成终极目标的规则 a. 如果规则 ...
- Linux中源码包的管理
什么是开放源码,编译程序和可执行文件 开放源码:就是程序代码,写给人类看的程序语言,但机器不认识,所以无法执行: 编译程序:将程序代码转译成为机器看得懂的语言: 可执行文件:经 ...
- 详解linux下auto工具制作Makefile源码包(制作篇)
2019独角兽企业重金招聘Python工程师标准>>> 详解linux下auto工具制作Makefile源码包(制作篇) 水木杨 一. 概述 为了更好的制作configure ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
为什么80%的码农都做不了架构师?>>> Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序 ...
- cppunit linux,Linux中使用CppUnit工具
介绍Linux平台下CppUnit使用方法 Linux中使用Cpp Unit单元测试工具 1. 下载安装Cpp Unit: 1). 从http://www.wendangwang.com/projec ...
最新文章
- 2 行代码,将 .NET 执行时间降低 87%!(附代码)
- WIN7下的VS2008在调试OpenCV_2.3.1的程序时报错丢失tbb_debug.dll的解决办法~
- CH0805 防线 (二分值域,前缀和,特殊性质)
- 音频编码:ADPCM
- Myeclipse7.X和8.X汉化
- clickhouse 的mysql表引擎
- 洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解
- 基于七牛播放器的直播
- java mysql模糊查询_java实现的连接数据库及模糊查询功能示例
- 苹果系统mac(Air)删除Windows合并盘(双系统)的可行方案
- java 前后端分离教程,Java web前后端分离
- java三角形边长_java三角形怎么求边?
- 荒野行动pc版服务器无响应,荒野行动PC版闪退怎么办 电脑版闪退解决方法
- 小米红米6Pro线刷兼救砖_解账户锁_纯净刷机包_教程
- python-KNN简单数据分类+dsift+手势识别
- Vue使用Object标签对接IC读卡器硬件
- 基于HTML电商项目的设计与实现——html静态网站基于数码类电商购物网站网页设计与实现共计30个页面...
- 记一次使用Cobar踩到的坑
- hdu1226超级密码【数字广搜+大数取模】
- python:批量处理txt文件,读取txt文件内容,根据内容(例子为数字1)提取出对应txt文件到其他文件夹,后根据txt文件名提取对应名字图片。