Makefile 简单学习
一、Makefile 简介
Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。
注意 Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。
一个规则 两个函数 三个变量
规则:
语法规则
目标 :依赖
命令1
命令2
.
.
目标: 目标即要生成的文件。如果目标文件的更新时间晚于依赖文件的更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则重新编译并更新目标。
依赖: 即目标文件由哪些文件生成。如果依赖条件中存在不存在的依赖条件,则会寻找其它规则是否可以产生依赖条件。
例如:规则一是生成目标 hello.out 需要使用到依赖条件 hello.o,但是 hello.o 不存在。则 Makefile 会寻找到一个生成 hello.o 的规则二并执行。
命令:即通过执行该命令,由依赖文件生成目标文件。
注意每条命令前必须有且仅有一个 tab 保持缩进,这是语法要求。
TARGET:Makefile 文件默认只生成第一个目标文件即完成编译,但是我们可以通过 “TARGET” 指定需要生成的目标文件。
实例:

第一个依赖关系:目标文件 test 依赖文件 1.o 123.o
第二个依赖关系:目标文件 %.o 依赖文件 %.c 这里代表“%” 所有的.o 文件依赖于.c文件
下面我们讲解其他内容:
三个变量:
Makefile 中也有一些已经定义好的常用变量,这里介绍其中常用的3个。
1.$@
表示规则中的目标,例如 test /$(TARGET)
2.$<
表示规则中的第一个依赖条件.
3. $^
表示规则中的所有依赖条件.如果依赖条件只有一个$^ 和 $< 区别不大。
两个函数:
1. wildcard
例如
SRC = $(wildcard ./*.c)
匹配目录下所有的 .c 文件,并将其赋值给 SRC 变量。
2. patsubst
pat 是 pattern 的缩写,subst 是 substring 的缩写。例如
OBJ = $(patsubst %.c, %.o, $(SRC))
这个函数有三个参数,意思是取出 SRC 中所有的值,然后将 “.c” 替换为 “.o”,最后赋值给 OBJ 变量。
伪目标 .PHONY
什么是伪目标?伪目标就是上面Makefile文件的clean就是伪目标,伪目标就是不对应实际的文件。但是,由于伪目标没有依赖体,所以它的命令是不会自动被make执行的,如果要编译执行这个目标体,那么只需 make clean,编译器就会编译执行clean的命令。但是,如果刚好有个名字叫做clean的文件存在,那么make就会发现它,但是clean没有依赖体,所以make就会认为clean已经是最新的文件从而不会执行其命令。为了处理这种情况,就需要使用特殊的目标体.PHONY。.PHONY的依赖体文件的含义和通常的一样,但是make不检查是否存在有文件名和依赖体中的一个名字相匹配的文件,而是直接执行与之相关的命令。
Makefile 简单学习的更多相关文章
- makefile简单学习
前言 在C语言中,我们需要将源代码生成可执行的程序.这里面其实要经过非常多的步骤.参看下图: 这中间主要通过make命令,读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化 ...
- makefile简单学习(一)
第一层 显式规则 目标:依赖 [tab] 指令 伪目标:.PHONY: 递归规则 hello : hello.o gcc hello.o -o hello hello.o : hello.s gcc ...
- Makefile的学习笔记
Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报 分类: Linux ...
- 运用Autoconf和Automake生成Makefile的学习之路
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...
- Linux yum的配置 , python环境管理, nginx搭建简单学习
Linux yum的配置 , python环境管理, nginx搭建简单学习 一丶配置yum的数据仓库 ### yum 工具, 方便,自行解决软件之间的依赖关系. # 配置yum源仓库 (可以使用,清 ...
- Gcc的Makefile简单使用
Gcc的Makefile简单使用http://blog.chinaunix.net/uid-9330295-id-2425867.html
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- Makefile基础学习
Makefile基础学习 理论知识 makefile关系到了整个工程的编译规则.一个工程中的源文件不计其数,并且按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文 ...
- shiro简单学习的简单总结
权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...
- CentOS 简单学习 firewalld的使用
1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...
随机推荐
- Java中的POJO是什么?
1.介绍 在这个简短的教程中,我们将研究"普通Java对象"(Plain Old Java Object)的定义,简称POJO.我们将看看POJO与JavaBean的比较,以及如何 ...
- Vue实现简单图书管理例子
以下内容整理自网络. 说明 本例主要涵盖以下知识点: 数据绑定 条件与循环 计算属性 监听器 过滤器 常见数组和对象操作 vue生命周期 示例演示 代码 <!DOCTYPE html> & ...
- win32 - WaitForMultipleObjects的使用
创建5个线程,并无限期地打印某些内容 #include <Windows.h> #include <stdio.h> DWORD IDs[5]; DWORD WINAPI Th ...
- RK3588开发笔记(一):基于方案商提供的宿主机交叉编译Qt5.12.10
前言 rk3588开发车机,方案上提供的宿主机只是编译rk sdk的版本,并未编译好Qt,那么需要自行交叉编译Qt系统.选择的Qt的版本为5.12.10. 宿主机准备 下载并打开宿主机,只 ...
- 如何优化好UITableView,值得思考
如果你觉得 UITableViewDelegate 和 UITableViewDataSource 这两个协议中有大量方法每次都是复制粘贴,实现起来大同小异:如果你觉得发起网络请求并解析数据需要一大段 ...
- Redis哨兵(sentinel)
目录 前言 原理 架构图 下载 命令 配置 启动 查看 Sentinel(哨兵)配置 常用命令 Q&A Redis主从配置异常解决:Error condition on socket for ...
- Cocos Creator 2.x升级至Cocos Creator 3.x
1.导入类时,批量导入 2.导入 override...关键字时,批量导入 3.this.node.scale = 0.6-->this.node.setScale(0.6, 0.6); 4.n ...
- 【Azure 环境】使用 az ad group create 时候遇见 Insufficient privileges to complete the operation
问题描述 使用China Azure,通过Azure CLI 创建AAD组报错,提示权限不足 Insufficient privileges to complete the operation # 使 ...
- 【Azure IoT Hub】从设备端如何向IOT发送海量数据,可以使用从设备到IoT连接的直接传输吗?如何把IoT Hub中的数据存储到Azure Storage中?
问题描述 IoT Hub 从设备端如何向IOT发送海量数据,可以使用从设备到IOT连接的直接传输吗?还是需要另外开启连接.另外,消息路由和上传文件使用的连接是否就是设备到IOT建立的连接?还是需要额外 ...
- 如何实现十亿级离线 CSV 导入 Nebula Graph
本文首发于 Nebula Graph Community 公众号 本次实践是基于业务需求及后续扩展,通过技术选型确定了 Nebula Graph 图数据库,首先需要验证 Nebula Graph 数据 ...