在大型项目开发中,通常有几十到上百个源文件,如果每次均手工键入gcc 命令进行编译的话,非常不方便,我们就思考,能不能用一个命令完成多个动作——这就是make的用处。

make工具通过makefile文件来完成并自动维护编译工作:我们可以用vi makefile来创建makefile文件,通过makefile文件的内容告诉make要做什么。

默认情况下,GNU make工具在当前工作目录中寻找makefile时,它会尝试以下几个名称(按顺序排列):GNUmakefile、makefile 和 Makefile,不建议使用GNUmakefile,有些版本的make可能不承认这个名称。

我们也可以选择给makefile使用一个自己指定的名字,可以用’-f’或’–file’选项来指定makefile的名称:用参数’-f NAME’或’–file=NAME’告诉’make’读取文件NAME作为makefile。

一个简单的makefile格式如下:

 TARGET ... : DEPENDENCY ...COMMAND

注意:这里COMMAND前面一定是Tab,即使按了8次Space键视觉效果看起来一样也会报错(missing separator (did you mean TAB instead of 8 spaces?)。如果是复制代码再粘贴,也可能会出现这个问题,这就需要删掉代码里的空格重新输入Tab。

TARGET
目标体,通常是一个由程序生成的文件的名称;目标体可以是可执行文件或目标文件,也可以是一个要执行的动作的名称,例如伪目标“clean”。
DEPENDENCY
目标体所依赖的文件,它被用来作为输入来创建目标。 一个目标经常依赖于几个文件。
COMMAND
所创建的目标体需要运行的命令,是 "make "执行的一个动作。 一个command可以有一个以上的命令,可以在同一行,也可以在各自的行中。

举个例子,我们先写一个名为“hello.c”的程序

#include<stdio.h>
int main()
{printf("Hello World!\n");
return 0;
}

再使用vi makefile命令创建一个名为makefile的新文件,按“i”进入编辑模式插入文本,输入下列代码(注意Tab! Tab! Tab! 的问题)

hello.o:hello.cgcc -c hello.c -o hello.o
hello:hello.ogcc hello.o -o hello

这里hello.o就是第一个目标体,hello.c是它依赖的文件(执行第一个命令需要的文件);
hello是第二个目标体,hello.o是它依赖的文件(执行第二个命令需要的文件)。
如果我们不加目标体,直接调用make,它会自动地执行第一个目标体,在这个例子里就是hello.o;要想让它执行第二个目标体,可以用“make+目标体”,在这个例子里就是make hello。

如果我们对上面那个makefile做出如下修改(调换第一和第二个目标体的位置)

hello:hello.ogcc hello.o -o hello
hello.o:hello.cgcc -c hello.c -o hello.o

我们会发现,调用make命令后仍然可以正常执行。
要想完成hello就必须依赖hello.o,根据make的“隐式规则”,执行hello时会自动的生成它的依赖文件hello.o,并且在使用该文件后不会将其删除,在当前目录下使用“ls”命令还可以查看到“hello.o”。

如果我们只想执行某个操作而不生成文件可以使用“伪目标”。
例如

clean:rm *.o temp

'rm’命令将在每次你说’make clean’时被执行,但是它永远不会创建一个名为’clean’的文件。

要想了解更多make的使用规则和用法,可以点击链接阅读
GNU_make

make和makefile的使用方法相关推荐

  1. Makefile常用调试方法

    转载自 陈皓<跟我一起写 Makefile><GNU Make项目管理> GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 1.warning函数 $(war ...

  2. Ubuntu ./configure 半途终止 导致没有生成makefile文件 解决方法

    在安装thrift的时候,解压包进入目录,执行命令: ./configure 之后,发现某些包没有安装,导致configure到一半的时候退出,接着make发现没有makefile文件.估计是我系统安 ...

  3. Linux之make 、makefile的使用方法

    先分别创建三个文件,如图 创建一个makefile文件,然后进行规则编写 现在就可以使用make命令编译文件了,这样是不是很方便呢?

  4. makefile的使用方法(简单视频教程以及详细文字教程)

    文章目录 1.makefile详细文字教程 2.makefile简单教程(B站视频教程) makefile基本语法格式: 简单示例(单文件)makefile写法 带包含关系的多文件makefile写法 ...

  5. makefile的使用方法(简单视频教程以及详细文字教程)(makefile教程、makefile教学)

    文章目录 1.makefile详细文字教程 2.makefile简单教程(B站视频教程) makefile基本语法格式: 简单示例(单文件)makefile写法 带包含关系的多文件makefile写法 ...

  6. Makefile中的几个调试方法

    网上本来确实有文章介绍,结果,某篇文章(https://blog.csdn.net/wlqingwei/article/details/44459139)内容错误,导致无法打印,而且内容一直没有修正, ...

  7. 【编译】makefile使用

    本文重在记录makefile的使用方法,不介绍相关原理. 注意:所有的makefile指令前面都需要两个 Tab 缩进 1.初步使用 创建工作目录,工作目录下创建如下两个文件: main.c #inc ...

  8. 向大家推荐一个C/C++通用Makefile

    在使用 Makefile 之前,只需对它进行一些简单的设置即可:而且一经设置,即使以后对源程序文件有所增减一般也不再需要改动 Makefile.因此,即便是一个没有学习过 Makefile 书写规则的 ...

  9. Makefile中打印变量

    一.使用info/warning/error增加调试信息 方法1: $(info, "here add the debug info") 但是此不能打印出.mk的行号 方法2: $ ...

最新文章

  1. 卷积后feature map尺寸计算公式
  2. 青源LIVE第29期|清华叉院高阳:使用1/500数据掌控Atari游戏-EfficientZero算法详解
  3. Js 拦截全局ajax请求
  4. 持久性session连接之memcached高可用方案
  5. python ctime源码_Python3基础 getatime getctime getmtime 文件的最近访问 + 属性修改 + 内容修改时间...
  6. linux 之RAID详解
  7. 说说基于网络的五种IO模型
  8. LeetCode 1265. 逆序打印不可变链表(递归)
  9. python历史以及基础知识
  10. RDLC 报表参数、常量及常用表达式的使用方法(上)
  11. Leetcode刷题记录[java]——561 Array Partition I
  12. 备份redis服务并ftp上传(shell)
  13. 计算机网络中数据包的分布,计算机网络习题.doc
  14. docker部署redis的单机/主从/哨兵/集群方法
  15. Python Opencv 简单视频裁剪功能的实现
  16. 9 客户端认证方式 之 PKCE
  17. LiveGBS国标流媒体-摄像头网络直播方案部署问题
  18. POI批量导出Excel ZIP打包下载
  19. redisclient工具个人理解
  20. SpringBoot入门系列(二)如何返回统一的数据格式

热门文章

  1. 骗子QQ879954281卖外汇CRM的QQ645271530
  2. Linux上基于IP访问网站、基于同一IP不同端口访问网站、基于DNS域名访问网站、将不同域名解析到同一IP不同端口
  3. php获取谷歌地图gps定位,谷歌地图 API 开发之获取当前坐标(经纬度)
  4. python django框架怎么爬虫步骤_python爬虫与Django框架vue交互的前后端代码详情(励志人生网实例)...
  5. hadoop FileInputFormat.addInputPaths兼容FileInputFormat.setInputPath
  6. PD QC AFC 受电端协议芯片
  7. js中clientWidth、scrollLeft、offsetX等宽高度和位置的用法
  8. java 给static变量赋值_java static变量可以赋值吗?
  9. Android开发之RelativeLayout
  10. XML——XML介绍和基本语法