第一篇 make与makefile介绍
我们在Linux系统中学习C语言或者C++语言时,大多数时候只是用gcc命令或者g++命令在命令行进行简单的编译、链接即可得到最终的可执行文件,进一步即可验证所写C/C++语言的正确性。但是,在大型工程项目中,源文件成千上万,甚至几十万都有可能,如果还是用命令行直接进行编译,这将是一项比南水北调还复杂的工程。由于文件之间复杂的依赖关系,直接使用命令行编译大型工程项目是不现实的,此时,makefile应运而生,makefile就是管理源文件之间依赖关系的一种脚本程序、也是一种脚本语言。
makefile脚本文件的内容大体由以下三点组成:
1、它定义了一系列规则来指定源文件编译的先后顺序。
规则是makefile中的重要概念,它一般由目标、依赖、命令组成。
2、拥有特定的语法规则,支持变量、函数、函数调用等。
3、能够直接集成操作系统中的各种命令。
你可能会问,makefile是不是只在Linux系统中存在?其实,在任何一个编译环境中都需要makefile的存在,在VS、Qt这种集成的开发环境中,开发工具已经帮我们管理好了源文件,而底层正是通过makefile实现的,只是,开发工具帮我们屏蔽了这些细节。
一些接触过makefile的同学可能会有疑问,makefile是不是只能应用在C/C++程序的编译中呢?答案是否定的。只要电脑系统中拥有了正确的编译环境(拥有对应语言的编译命令、正确配置了环境变量),makefile可以应用于任何编译型语言的依赖管理。
既然,makefile是一种脚本语言,那么makefile的解释器是什么呢?没错,就是make,make是一个解释器,是一个应用程序。make应用程序具体有以下三个作用:
1、根据makefile文件中的程序解析出文件之间的依赖关系。
根据makefile语法,我们将源文件的依赖关系写在了makefile文件中,而make应用程序解析该文件的内容并得到源文件之间的依赖关系,进一步确定并控制文件的编译顺序。
2、根据文件之间的依赖关系,自动维护编译工作。
假设一个工程中有10000个源文件,在作用1中,make已经将它们之间的依赖关系确定出来,但是,在编译的过程中,由于makefile程序中所写命令的错误或者源程序中的语法错误,导致make应用程序在编译到第5000个程序时出现错误并终止执行,根据错误提示我们更改makefile程序中的指令或者源文件中的相关语句,并再次执行make。由前面分析可知,在第5000个程序编译出错时,前4999个程序已经进行了成功编译,而修改第5000个源文件或者makefile指令时,前4999个源文件没有进行更新或更改,因此,再次执行make时无需重新编译这4999个文件,直接使用已经编译好的结果即可。make自动维护编译工作就是这个意思,它能非常聪明的知道哪些文件需要重新编译,哪些不需要重新编译。在大型工程中,大大节省了编译时间。
3、执行宿主操作系统中的各种命令
例如,在Linux系统中,makefile程序中可以调用任何Linux下的命令,make在解析makefile时,可以解析出这些命令,并执行这些命令来完成任务。在Windows等其他系统中一样如此。
实际中,makefile在Linux系统的开发中使用最为广泛,且需要开发人员手工编写,包括嵌入式Linux开发、Linux应用开发等。接下来,我们主要介绍Linux下与C语言开发相关的makefile。
规则是makefile中的重要概念,一条规则如下所示:
其中,第1、2行共同组成一个规则,第一行的hello是该规则的目标,冒号(:)后的为该规则的依赖,本规则中依赖为空,第2行的echo “Hello Makefile”为该规则的命令,规则的命令所在的行必须以tab键开头(不能以多个空格键代替),否则make解释器在解释该makefile时会报错。
makefile文件的文件名可以随意命名(符合操作系统的习惯),Linux命令行在调用make应用程序时,通过-f选项指定makefile文件名即可,并可以同时指定make的执行目标。如下图所示:
将makefile文件改名为1.txt。第一条编译命令make -f 1.txt hello中,-f指定了makefile文件的文件名为1.txt,并去该文件中寻找hello目标,执行该目标下的命令。第二条命令没有指定目标,则默认寻找1.txt文件中第一个目标。
Linux的设计哲学是越简单越好,因此,make也可以不指定文件名称及目标。如下所示:
将makefile文件改名为makefile,第一条命令make会使得make解释器在当前目录下寻找名字为makefile或者Makefile的文件,并默认寻找该文件中的第一个目标,执行该目标下的指令。第二条命令make test,会使得make解释器在当前目录下寻找名为makefile或者Makefile的文件,并寻找该文件下的test目标,执行该目标下的指令。
至此,makefile的基本概念讲解完了,后续会有更加深入的makefile系列文章。
欢迎评论、指导以及进一步交流,QQ527635593
本文参考:
狄泰软件教学课件
gun make手册
专业嵌入式软件开发
第一篇 make与makefile介绍的更多相关文章
- Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署
序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在 ...
- Python全栈开发之路 【第一篇】:Python 介绍
本节内容 一.Python介绍 python的创始人为荷兰人——吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本 ...
- 第一篇 SQL Server代理概述
本篇文章是SQL Server代理系列的第一篇,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Serve ...
- 我们一起学习WCF 第一篇初识WCF(附源码供对照学习)
前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wc ...
- 【译】第一篇 SQL Server代理概述
本篇文章是SQL Server代理系列的第一篇,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Serve ...
- android调用第三方库——第一篇 (转载)
转自:http://blog.csdn.net/jiuyueguang/article/details/9447245 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言: 这两天一直在研 ...
- 跟初学者学习IbatisNet第一篇
写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正…………………… 第一篇就简单介绍一下什么是IbatisNet,然后写一个简单的Demo,在后 ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
随机推荐
- Leetcode 116
/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNod ...
- 【LeetCode】N数和
1. 3Sum 给定一个无序数组(可能存在重复元素),是否存在三个数之和为0,输出所有不重复的三元组. e.g. 给定数组 [-1, 0, 1, 2, -1, -4], 结果集为:[ [-1, 0, ...
- Script to Collect Log File Sync Diagnostic Information (lfsdiag.sql) (文档 ID 1064487.1)
the article from :http://m.blog.itpub.net/31393455/viewspace-2130875/ Script to Collect Log File Syn ...
- weblogic查看版本号教程
1.查看软件版本号 cd /weblogic/bea/wlserver_10.3/server/lib java -cp weblogic.jar weblogic.version 说明:版本号后边的 ...
- 一篇文章有若干行,以空行作为输入结束的条件。统计一篇文章中单词the(不管大小写,单词the是由空格隔开的)的个数。
#include <iostream>using namespace std; int k = 0;int n = 0;int main() { char c; char a[1000]; ...
- 默认五笔输入法qq
默认五笔输入法 1● 五笔设置 2● 语言设置 Success
- git Please move or remove them before you can merge.
git clean -d -fx "" 其中 x -----删除忽略文件已经对git来说不识别的文件 d -----删除未被添加到git的路径中的文件 f -----强制运行
- Win10系列:JavaScript页面导航
页面导航是在开发应用的过程中使用频率较高的技术,其中比较常用的导航方式有多页导航和页内导航,采用多页导航方式的应用程序包含一系列的页面,在一个页面中加入另一个页面的链接地址后,单击链接将跳转到指定页面 ...
- WPF技术实现控件截图
1.http://www.cnblogs.com/TianFang/archive/2012/10/07/2714140.html 2.http://www.silverlightchina.net/ ...
- hybrid几种模式
native和web适合的场景 Native: 用户体验要求高 业务变动很小(如首页) 性能要求高 Web: 业务变化频繁(如广告) 性能要求低 展示性内容 hybrid App其实会有不同的分支 方 ...