1. make 命令与 Makefile 文件

在 Linux 平台,执行 make 命令时,会在当前目录下寻找 Makefile(或 makefile)文件,Makefile 文件说明了如何编译(compile)和链接程序(link)。

2. Makefile 语法规则

Makefile 结构分为三部分,

target : prerequisites
command
  • target:可以为一个 object file(目标文件,拓展名为 .o),也可以是一个可执行文件;
  • prerequisites:欲生成 target 所需的文件(比如欲生成 .o 目标文件,所需的 .c 文件和 .h 头文件,欲生成可执行文件所需的 .o 目标文件),可以有多个(以空格隔开)
  • command:
    • cc:c/c++ 的编译命令
    • -

  • Makefile 的这三部分结构,可以理解为:
    • prerequisites 为输入;
    • target 为输出;
    • command 为使输入变为输出的命令操作;

3. 一个示例

当前工程有 3 个头文件(defs.h,command.h,buffer.h),8 个 c 文件(main.c, kbd.c,display.c,insert.c,command.h,search.c,files.c,utils.c),根据上文所述规则,编写如下的 Makefile 文件:

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o /*注释:如果后面这些.o文件比edit可执行文件新,那么才会去执行下面这句命令*/
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o 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 main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
  • \:表示换行;

4. 使用变量

上文的 Makefile 文件未定义变量,使用变量对一些文件名进行重命名,可以简化 Makefile 文件的编写,比如对于第一条规则:

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

通过定义变量的方式可以重写为:

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

5. 自动推导

GNU 的 make 很智能,其可以自动推导文件以及文件依赖关系后面的命令,我们便不必为每一个 .o 文件后都写上类似的命令,通过 make 的自动识别以及对命令的自动推导。

只要 make 看到一个 [.o] 文件,它就会自动的把同名 [.c] 文件加在依赖关系中,如果make找到一个whatever.o,那么 whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile 再也不用写得这么复杂。

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc = gcc 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 .PHONY : clean
clean :
rm edit $(objects)
  • .PHONY:表示 clean 是一个伪目标文件;

6. Makefile 规则中的通配符

  • *:任意一个或任意多个字符;
  • ?:任意一个字符;
  • […]:ex. [abcd] 表示 a, b, c, d 中任意一个字符;
    • [^abcd]:表示除 a, b, c, d 以外的字符;
    • [0-9] 表示 0-9 中的任意一个数字;
  • ~:home 目录;

Makefile 文件怎么写的更多相关文章

  1. 实例学习写Makefile文件

    目录 0. 扫盲 1. 编译,链接 2. Makefile文件执行 3. Makefile书写规则 4. 案例 5. Makefile是如何工作的 6. 拔高,参考 0. 扫盲 Linux 环境下的程 ...

  2. makefile文件写法解析

    一.makefile文件示例 makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了. # this is a makefile #这一行是注 ...

  3. 怎样写Makefile文件(C语言部分)

    本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org. ...

  4. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  5. Linux工具入门:make工具与Makefile文件

    1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...

  6. Makefile文件学习总结

    Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...

  7. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

  8. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  9. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

随机推荐

  1. java编码终极探秘

    首先要明白,java中string字符串都是unicode码保存的,只不过显示的时候会根据一定的规则,比如GBK或者是UTF-8去对照表中查找进行显示. 之所以会乱码就是因为使用错了编码方式. 数据是 ...

  2. iOS实现图形编程可以使用三种API(UIKIT、Core Graphics、OpenGL ES及GLKit)

    这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境.offscreen 位图环境和PDF图形环境,用来在屏幕表面.一个位图或一 ...

  3. Cesium学习笔记(四)Camera

    http://blog.csdn.net/HobHunter/article/details/74909641 Cesium 相机控制场景中的视野.操作相机的方法有很多,如旋转,缩放,平移和飞到目的地 ...

  4. FTP服务器访问主动模式、被动模式

    在公司里面,经常需要访问外网FTP取资料等情况.但是有时用windows界面访问经常遇到各种问题. 下面介绍两种客户端是如何访问ftp服务器. 首先我们需要说明:防火墙,是阻拦外界与内部的通讯的一道关 ...

  5. zTree 模糊搜索

    /** * 搜索树,高亮显示并展示[模糊匹配搜索条件的节点s] * @param treeId * @param searchConditionId 搜索条件Id */ function search ...

  6. LIS(两种方法求最长上升子序列)

    首先得明白一个概念:子序列不一定是连续的,可以是断开的. 有两种写法: 一.动态规划写法 复杂度:O(n^2) 代码: #include <iostream> #include <q ...

  7. Whl自助搜索下载器

    本文转载自以下链接:https://github.com/Light-City/AutoDownloadWhl 源码地址: https://github.com/Light-City/AutoDown ...

  8. 洛谷 2147 SDOI2008 Cave 洞穴勘测

    [题解] 动态树模板题,只要求维护森林的连通性,直接上板子即可. #include<cstdio> #include<algorithm> #define N 500010 # ...

  9. 4、ceph-deploy之配置使用对象存储

    从firefly(v0.80)版本开始,ceph存储显著的简化了安装和配置Ceph Object Gateway, Gateway进程嵌入到Civetweb,所以你需要安装一个web服务,或者配置Fa ...

  10. [bzoj4636]蒟蒻的数列_线段树

    蒟蒻的数列 bzoj-4636 题目大意:给定一个序列,初始均为0.n次操作:每次讲一段区间中小于k的数都变成k.操作的最后询问全局和. 注释:$1\le n\le 4\cdot 10^4$. 想法: ...