在提及‘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’相关推荐

  1. 在Linux中制作实用程序(MakeFile)

    Hey folks, have you ever used IDEs? Most probably, yes. So what's your favorite one? Geany, CodeBloc ...

  2. Linux中make工具及makefile文件

    一.make工具简介 1.make 工具通过一个称为 makefile 的文件(类似脚本)来完成并自动维护编译工作,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行 ...

  3. linux增量编译不成功,Linux学习笔记-增量编译(Makefile进一步使用)

    增量编译 在VC中就是增量编译! 当某个cpp更新后,只编译这个cpp文件,称为增量编译. 在Linux中,通过控制Makefile实现增量编译的效果 Makefile中使用"依赖depen ...

  4. Linux学习笔记-增量编译(Makefile进一步使用)

    增量编译 在VC中就是增量编译! 当某个cpp更新后,只编译这个cpp文件,称为增量编译. 在Linux中,通过控制Makefile实现增量编译的效果 Makefile中使用"依赖depen ...

  5. linux未找到make命令,linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法)...

    linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法) 发布时间:2020-09-15 04:09:36 来源:脚本之家 阅读:375 ...

  6. linux make项目管理器,Linux中makefile项目管理

    一.整体大纲 二.makefile的编写 一个规则   两个函数  三个变量 1. 一个规则 三要素: 目标, 依赖, 命令 目标:依赖 命令 1) 第一条规则是用来生成终极目标的规则 a. 如果规则 ...

  7. Linux中源码包的管理

    什么是开放源码,编译程序和可执行文件     开放源码:就是程序代码,写给人类看的程序语言,但机器不认识,所以无法执行:     编译程序:将程序代码转译成为机器看得懂的语言:     可执行文件:经 ...

  8. 详解linux下auto工具制作Makefile源码包(制作篇)

    2019独角兽企业重金招聘Python工程师标准>>> 详解linux下auto工具制作Makefile源码包(制作篇) 水木杨 一.     概述 为了更好的制作configure ...

  9. Linux中的动态库和静态库(.a/.la/.so/.o)

    为什么80%的码农都做不了架构师?>>>    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序 ...

  10. cppunit linux,Linux中使用CppUnit工具

    介绍Linux平台下CppUnit使用方法 Linux中使用Cpp Unit单元测试工具 1. 下载安装Cpp Unit: 1). 从http://www.wendangwang.com/projec ...

最新文章

  1. 2 行代码,将 .NET 执行时间降低 87%!(附代码)
  2. WIN7下的VS2008在调试OpenCV_2.3.1的程序时报错丢失tbb_debug.dll的解决办法~
  3. CH0805 防线 (二分值域,前缀和,特殊性质)
  4. 音频编码:ADPCM
  5. Myeclipse7.X和8.X汉化
  6. clickhouse 的mysql表引擎
  7. 洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解
  8. 基于七牛播放器的直播
  9. java mysql模糊查询_java实现的连接数据库及模糊查询功能示例
  10. 苹果系统mac(Air)删除Windows合并盘(双系统)的可行方案
  11. java 前后端分离教程,Java web前后端分离
  12. java三角形边长_java三角形怎么求边?
  13. 荒野行动pc版服务器无响应,荒野行动PC版闪退怎么办 电脑版闪退解决方法
  14. 小米红米6Pro线刷兼救砖_解账户锁_纯净刷机包_教程
  15. python-KNN简单数据分类+dsift+手势识别
  16. Vue使用Object标签对接IC读卡器硬件
  17. 基于HTML电商项目的设计与实现——html静态网站基于数码类电商购物网站网页设计与实现共计30个页面...
  18. 记一次使用Cobar踩到的坑
  19. hdu1226超级密码【数字广搜+大数取模】
  20. python:批量处理txt文件,读取txt文件内容,根据内容(例子为数字1)提取出对应txt文件到其他文件夹,后根据txt文件名提取对应名字图片。

热门文章

  1. 图像分割学习笔记_1(opencv自带meanshift分割例子)
  2. 【排序算法】冒泡排序
  3. C++对类或结构体进行指定规则排序
  4. EXCEL 跨列居中
  5. java 设置系统参数_Java设置系统参数和运行参数
  6. 实习成长之路:MySQL九:为什么MySQL有时候会选错索引呢?
  7. Java开发中,接口参数校验
  8. Android Multimedia框架总结(十)Stagefright框架之音视频输出过程
  9. 子类发送消息_RocketMQ生产消息源码解析
  10. oracle的update加并发,关于update操作并发问题