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

相关链接

最新文章

  1. 448. Find All Numbers Disappeared in an Array
  2. KMP算法-next函数求解
  3. 数据字典和动态性能视图<五>
  4. Tab的键的妙用
  5. 软件工程实践小队Scrum Meeting
  6. ALM11用例测试类型
  7. .net导出不规则Excel
  8. LxNx前端F2F面试问题整理
  9. 【Oracle】控制文件管理
  10. iOS 开发 atomic 与 nonatomic 区别
  11. 8.1 使用Python操作SQLite数据库
  12. 如何打开用eclipse没有.project文件的Java工程
  13. centos6.5重新调整/home和跟目录/大小
  14. 计算概论(A)/基础编程练习2(8题)/5:点和正方形的关系
  15. linux下文件内容查找 转
  16. java Overloaded的方法是否可以改变返回值的类型?
  17. odoo权限管理(二.记录管理)
  18. VC6微软正则表达式greta使用案例
  19. OpenSSL 自签名证书
  20. 【转】高效率编辑器VIM

热门文章

  1. 两个看似相同,结果不同的SQL逻辑
  2. OpenCV-Python 图像阈值 | 十五
  3. TensorFlow v2.0实现逻辑斯谛回归
  4. NEKO's Maze Game - Codeforces 题解
  5. 三、【Docker笔记】Docker镜像
  6. [bzoj4977]跳伞求生<贪心>
  7. P1203 [USACO1.1]Broken Necklace(模拟-枚举)
  8. P1004 方格取数(四维dp)
  9. wsl中配置SML环境
  10. js中的位置属性