makefile简介


  • makefile可实现工程的自动化编译,只需一个make命令即可一键完成。makefile定义了一些规则,指定哪些文件需要先编译、后编译、重新编译等。

  • 一般的C或者C++程序,都需要先编译成中间文件,windows下为.obj文件,UNIX下为.o文件,这个过程称为编译(compile)。

  • 每个原文件都应该对应一个中间文件(.obj文件或者.o文件),把大量的中间文件合成执行文件的过程,称为链接(Link);链接时,主要是链接函数和变量,即可以使用.obj文件或者.o文件链接应用程序。链接器只关系函数的中间文件,不关心源文件的位置,为了避免大量的中间文件的复杂管理,需给中间文件打包,windows下称为库文件(Library File),即.lib文件,UNIX下为Archive File,即 .a文件。

makefile规则


流程

目标 : 需要的条件(注意 : 两边的空格)
命令(以Tab键开头)

解释一下:

  • 目标 可以是一个或者多个,可以是ObjectFile文件、执行文件、甚至标签
  • 条件 指的是 依赖的文件或者目标
  • 命令 指的是 生成目标需要执行的脚本

总结:即一条makefile规则定义了编译的依赖关系,目标文件依赖于条件,生成规则用命令

举个例子

objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)

make命令


  1. 首先在当前目录下寻找"makefile"或者"Makefile"文件找到,则定位到第一个目标文件(target),上例中,会找到"edit"文件,并把此文件作为最终目标文件
  2. 若eidt文件不存在,或者eidt后依赖的.o文件的修改时间比edit文件新,则执行后面定义的命令生成edit文件
  3. 若edit后依赖的.o文件也不存在,make会在当前文件中寻找.o文件的依赖性,若找到,则根据那个规则生成.o文件.c和.h文件存在,make生成.o文件,最后执行edit

自动推导

GNU的make命令支持自动推导,只要make看到一个.o文件,就会自动把.c文件加到依赖关系中,则上述例子可简化为以下形式

objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects) main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
  clean :
rm edit $(objects)

文件功能

make支持多文件共简规则,上述例子可进一步简化为如下形式(但不推荐,因为较难维护)

objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects) $(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
clean :
rm edit $(objects)

清空目标文件规则

每一个makefile文件都应该清楚的写一个清空目标的(.o和执行文件)规则,有利于重编译和文件的清结性。

.PHONY表示clean是一个"伪目标",rm前的减号表示,某些文件出问题但是不要管,继续往下走。

clean默认放在文件尾,不然会被当作默认目标。

 `一般的风格为:`
clean:
rm edit $(objects)
`较为稳健的方法:`
.PHONY : clean
clean :
-rm edit $(objects)

make编译安装

流程

  • 首先下载.tar.gz或者.tar.bz2软件包文件

  • 使用tar命令解压

  • 进入到解压后文件目录(因为make是搜索当前文件位置)

  • 使用./configure -prefix={Your Install Path} (其他configure参数自行百度)

  • make编译(或者使用make all,过程有时很慢,有时会报错,可能是依赖包的问题,解决依赖关系即可)

  • make install 安装(需足够权限,部分软件需要make check 或者 make test 进行测试)

  • make clean 清除编译产生的中间文件(Objectfile或者.o文件)

举个例子

//1.解压缩
tar -zxf xxxxx-4.0.2.tar.gz
//2.进入目录
cd xxxxx-4.0.2
//3.配置
./configure --prefix=/usr/local/xxxxx
//4.编译
make all
//5.安装
make install && make install-init && make install-commandmode && make install-config
//6.清除中间文件
make clean

相关链接

GNU的make命令、makefile编写的更多相关文章

  1. 2.linux下Makefile编写规范

    转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...

  2. makefile编写--引用

    1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之 ...

  3. makefile编写

    概述 什么是makefile?或许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序猿,makefil ...

  4. Makefile编写 一 *****

    编译:把高级语言书写的代码转换为机器可识别的机器指令.编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行.编译时,编译器检查高级语言的语法.函数与变量的声明是否正确.只有所有的语法正确.相关变 ...

  5. Yocto开发笔记之《Makefile编写》(QQ交流群:519230208)

    开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 =============================== ...

  6. Make和Makefile编写(详见GCC手册)

    Makefile和Make Rules 多模块软件.依赖树和Make 默认规则 Make使用程序对简单变量的支持 内建变量 虚目标 特殊目标 一般性语法错误及其纠正措施 命令行的使用和调试 Makef ...

  7. linux 下C语言编程库文件处理与Makefile编写

    做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...

  8. 单目录下多文件 makefile编写

    makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东 ...

  9. Linux——makefile编写

    以前对makefile的编写,限于刚开始接触,我都比较局限一些死板的格式,有时候就会显得有些繁琐.在进一步了解一些系统编译和链接的知识后,对makefile编写流程有了一些新的认识,所以来此梳理梳理, ...

随机推荐

  1. Servlet(一)----快速入门

    ## Servlet:server applet *  概念:运行在服务端的小程序 *  servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则. *  将来我们自定义一 ...

  2. cookie sessionStorage localStorage 使用小结

    1.cookie 随http 一起发送 2.webStorage 客户端本地存储功能 可以在客户端 本地建立 一个数据库 不参与与服务器的通讯 setItem (key, value)   —— 保存 ...

  3. 使用TensorFlow v2.0构建卷积神经网络

    使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...

  4. 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(四)

    作者:Geppetto 前面我们介绍了特征选择(Feature Selection,FS)与离散化数据的重要性,介绍了PSO在FS中的重要性和一些常用的方法.FS与离散化的背景,介绍了EPSO与PPS ...

  5. 用卷积神经网络和自注意力机制实现QANet(问答网络)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/ ,学习更多的机器学习.深度学习的知识! 在这篇文章中,我们将解决自然语言处理(具体是指问答)中最具挑战性 ...

  6. React入门(2)

    承接上次学习的react,今天继续学习react 划重点!!! 今天学习的全是react的核心概念:①props②ref③state 一.核心概念---props 作用:主要用来实现父子组件通信 1. ...

  7. 运行redis数据库

    启动redis服务器:redis-server /usr/local/redis-5.0.5/etc/redis.conf 关闭: redis-cli shutdown启动客户端:进入bin文件夹,输 ...

  8. Pytest系列(1) - 快速入门和基础讲解

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 目前有两种纯测试的测试框架, ...

  9. ionic中select下拉框点击无反应解决办法

    两种解决办法: 1.在select外的div加入属性 data-tap-disabled=”true” 2.找到ionic.bundle.js文件 的下面这个函数,添加如图两行代码  

  10. Django-使用 include() 配置 URL

    如果项目非常庞大,应用非常多,应用的 URL 都写在根 urls.py 配置文件中的话,会显的非常杂乱,还会出现名称冲突之类的问题,这样对开发整个项目是非常不利的. 可以这样解决,把每个应用的 URL ...