Linux下makefile学习
[make是什么?]
make是一个命令工具,是一个解释makefile中指令的命令工具。它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。make 会自动的判别原始码是否经过变动了,而自动更新执行档。
[为什么要使用make?]
假设,现在一个项目里面包含了100个程序文件,如果要对这个项目进行编译,那么光是编译指令就有100条。如果要重新进行编译,那么就又得像之前一样重新来一遍。这样重复且繁琐的工作实在是让我们很不爽啊。所以,用make来进行操作,间接调用gcc岂不是很方便?如果我们更动过某些原始码档案,则 make 也可以主动的判断哪一个原始码与相关的目标文件档案有更新过, 并仅更新该档案。这样可以减少重新编译所需要的时间,也会更加方便。
[makefile又是干什么的?]
makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息!
makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
[定义]
Makefile文件由一系列规则(rules)构成。每条规则的形式如下。
<target> : <prerequisites>
[tab] <commands>
上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。
目标:
一个目标就构成一条规则。目标通常是文件名,指明make命令要构建的对象,目标可以是一个文件名,也可以是多个文件名。之间用空格分隔。
除了文件名,目标还可以是某个操作的名字(如:clean),这称为是“伪目标”(phony target)
前置条件:
前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。
命令:
命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。
当你写下一个规则的时候,例如:
unit: output.o test2.o
gcc -o unit output.o test2.o
就是说,让编译器以(output.o test2.o)为前置条件,使用gcc编译器对这两个目标文件进行链接生成 unit 可执行文件 ,
但是如果(output.o test2.o)这两个文件中有一个不存在,我们可以在makefile文件中再添加两条规则来生成这个文件.
output.o:test2.h output.c
gcc -c output.c test2.o:test2.h test2.c
gcc -c test2.c
对于两个源文件一个头文件,使用一个完整的makefile文件规定他们之间的编译规则:
unit: output.o test2.o
gcc -o unit output.o test2.o output.o:test2.h output.c
gcc -c output.c test2.o:test2.h test2.c
gcc -c test2.c #删除所有目标文件,并声明clean为伪目标
.PHONY:clean
clean:
rm *.o
执行结果:
Make 处理makefile文件的过程了解一下?
缺省情况下,make开始于第一个目标,这个目标称为缺省最终目标.如上面的makefile文件中的 unit .
这样,当我们在终端敲下 make 命令的时候,Make 就会读取当前目录下的makefile文件,并开始处理第一条规则,本例中就是链接生成unit可执行文件,
但在make全部完成本规则工作之前,必须先处理 unit 所依靠的OBJ文件,这些OBJ文件被按照自己的规则处理更新,每个OBJ文件的更新规则是编译其源文件.如果源文件都没有改变,则不进行重新编译.
其他规则的处理根据他们的目标和缺省最终目标的依赖关系来判断,如果没有任何关联,则不会被执行.除非告诉make强制执行.如:[make clean]
在OBJ文件被重新编译(如果需要的话)之后,make决定是否重新链接生成unit的可执行文件.任何文件有改变的话,则对有依赖的文件进行编译,并生成新的可执行文件.
参考资料:
https://www.cnblogs.com/qiaopei/p/5550168.html
Linux下makefile学习的更多相关文章
- Linux下Makefile学习笔记
makefile 可以用于编译和执行多个C/C++源文件和头文件. (1) #include "file.h" 和 #include <file.h> 的区别 #inc ...
- linux 下makefile
linux下c编程中makefile是必须会的,我刚开始学,将我对makefile的理解记录下来. 通常我们在windows下编写c程序,有各种ide工具为我们执行makefile工作但在linux下 ...
- 在linux下makefile的使用
在linux下makefile的使用
- Linux下iptables学习笔记
Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...
- 【转载】Linux下makefile详解--跟我一起写 Makefile
概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...
- 2.linux下Makefile编写规范
转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...
- Linux下MakeFile初探
make是linux下的编译命令,用于编译和生成Linux下的可执行文件.这个命令处理的对象是Makefile,makefile等.由于make的强大解析能力,makefile文件的编写也变得极为简单 ...
- Linux下编程学习一
本篇主要记录一些在学习LINUX下编程时,, C和C++语言的一些基础的常识, 一. 函数指针 void MyFun(int x); 函数声明 void (*FunP)(int ); 函数指针声明 下 ...
- Linux下Makefile的automake生成全攻略--转
http://www.yesky.com/120/1865620.shtml 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下 ...
随机推荐
- canvas应用——将方形图片处理为圆形
上段时间在项目中需要将方形图片处理为圆形图片,你可能会说直接用css设置border-radius: 50%就可以了,但是项目中还要将此图片的圆形图片作为一部分利用canvas将其绘制到一张背景图上面 ...
- vs2013修改书签(vs书签文件位置)
visual studio 2013 的书签功能很好用,可以记录一些代码的位置:方便查阅: 不过当项目被他人修改过后,svn update 更新过后,书签的文件行号不变,但是已经不再是原来记录的哪一行 ...
- 解密gzip压缩的网页数据流(转)
因为采集某个网页遇到问题,一直无法获取页面数据. 经过一番排查,发现该网站会检查客户端的Header信息,如果遇到不明确的Header信息就直接否定,返回0数据. 如果Header信息正确,就会返回经 ...
- pytorch中检测分割模型中图像预处理探究
Object Detection and Classification using R-CNNs 目标检测:数据增强(Numpy+Pytorch) - 主要探究检测分割模型数据增强操作有哪些? - 检 ...
- PPTP 在Centos 7.1 建立方法与失效处理
# yum install pptp pptp-setup pptpsetup --create vpn --server (serverName) --username (Username) - ...
- 学习一个Vue模板项目
最开始学习Vue的时候,不建议直接使用模板,而应该自己从头写起.模板都是人写的,要坚信"人能我能".只有自己亲自实践,才能促进自己主动思考,才能对模板.框架有深刻的理解. 在Git ...
- R语言手册
在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data analysis and visualization which is built bas ...
- R绘制3D散点图
目前主要使用ggplot2做一些数据可视化的分析,但是ggplot2有个很大的缺陷是不支持3D作图,所以需要查找其他替代方案. 下面找到的两个替代方案不错,亲测可行,记录于此. 交互3D librar ...
- [ci]jenkins构建容器项目java-helloworld-非docker plugin模式
栗子思路说明: 不使用任何docker plugin 使用jenkins server本地(含mvn环境)构建,无jenkins slave jenkins server本地构建的war包,推送dep ...
- java 生成Http 头部date格式的string-RFC 1123 Date Representation in java
https://blog.csdn.net/lvzhuyiyi/article/details/51770148 ******************************************* ...