Makefile文件应用——simple项目
学习资料
本文主要参考资料:驾驭Makefile(李云).pdf
原理
(1)最基本的语法
targets: prerequisites
command
targets是目标,prerequisites是先决条件,目标依赖于先决条件。
command是生成目标的命令。
这一整个形式就是规则。
(2)目标的生成
一个目标的生成(目标不存在或者依赖比目标新才会重新创建目标):
(1)先判断目标是否有依赖,有则寻找相应规则生成依赖;
(2)没有依赖,运行命令生成target。
(3)依赖的生成递归调用(1)和(2)
如下图所示:

(3)Makefile目标语法
- 默认目标为第一个目标
- 伪目标,可以用.PHONY: clean【避免与现有的文件同名】
simple项目
写Makefile文件之前,需要先想好依赖关系,再进行编写。
假设现在有foo.c和main.c两个文件,则依赖关系如下:
foo.o foo.c simple main.o main.c
生成main.o命令:gcc -o main.o -c main.c
生成foo.o命令:gcc -o simple main.o foo.o
gcc的-o选项,指定输出文件的文件名
gcc的-c选项,仅作预处理、编译和汇编并生成目标文件
变量
(1)变量定义及引用
定义:EXE = simple
引用:$(EXE)或${EXE}
(2)特殊变量
$(MAKE) -》 make命令名是什么
$(MAKECMDGOALS) -》 make的目标是什么
(3)变量的类别
EXE = simple 递归扩展变量
EXE := simple 简单拓展变量,只进行一次扫描和替换
EXE ?= simple 条件赋值变量,当前变量以前没有定义就进行赋值,否则不处理
(4)自动变量
目标和先决条件在规则的命令中多次出现,应尽量避免
$@是指 造成命令运行的目标(可能有多个)。
$^是所有先决条件
$<是第一个先决条件
(5)变量来源
- Makefile定义的变量
- 自动变量,如$@ $^ $<等,根据上下文自动获得变量值
- Shell环境
- 在运行make命令是定义变量
(6)高级变量引用
$(EXE:.o=.c)自动完成后缀替换,可用patsubst完成同样的功能。
(7)override指令
不希望Makefile文件中定义的变量被覆盖掉。
模式
对于多个规则去生成多个目标文件,如main.o和foo.o都有一条规则进行描述。
每一个object文件都有一条规则的话,这是非常麻烦的。
%.o : %.c ;
<command ......>;
在模式规则中,目标可能会是多个的,如果有模式匹配出多个目标,make就会产生所有的模式目标。
如果要生成的目标是 a.o b.o,那么%c 就是 a.c b.c,则会产生两个目标,规则分别如下。
foo.o : foo.c ;
<command ......>;
main.o : main.c ;
<command ......>;
函数
(1)wildcard
在Makefile规则中,通配符会被自动展开,但在变量的定义和函数引用时,通配符将失效。
如果需要通配符有效,就需要使用函数“wildcard”,用法是:$(wildcard PATTERN...) ,如$(wildcard *.c)。
在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。
(2)patsubst
patsubst函数是用来进行字符串替换的,语法:
$(patsubst pattern, replacement, text)
eg:$(patsubst %.c, %.o, $(mixed))
(3)addprefix
addprefix函数是用来给字符串的每个子字符串前加上一个前缀,语法:
$(addprefix prefix, names...)
(4)filter
filter函数用于从一个字符串中,根据模式得到满足模式的字符串,语法:
$(filter pattern..., text)
(5)filter-out
filter-out函数用于从一个字符串中,根据模式去除满足模式的字符串,语法:
$(filter-out pattern..., text)
(6)strip
strip函数用于去除变量中多余的空格,语法:
$(strip string)
Makefile文件应用——simple项目的更多相关文章
- Makefile文件应用——huge项目
提高复用性 在build目录下,保存公用部分make.rule (1)绝对路径 用ROOT变量保存项目根目录 (2)增加控制变量 EXE/LIB/ (3)头文件查找目录 gcc 的-I(i的大写)选项 ...
- Makefile文件应用——complicated项目
学习资料 本文主要参考资料:驾驭Makefile(李云).pdf Complicated项目 需求: (1)object文件放到objs目录下 (2)可执行文件放到exes目录下 (3)增加头文件依赖 ...
- 简单编写makefile文件,实现GCC4.9编译项目,增加boost库測试等等。。
一.须要用到的hw.cpp hw.h funtest.cpp funtest.h makefile 几个測试文件 1.hw.cpp代码例如以下: #include "hw.h" # ...
- 利用 autoconf 和 automake 生成 Makefile 文件
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- Linux内核Makefile文件(翻译自内核手册)
--译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...
- makefile文件的技术
[快速的学习笔记] gcc命令:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html#_Toc311642845 makef ...
- Linux平台Makefile文件的编写基础篇(转)
目的: 基本掌握了 make 的用法,能在Linux系统上编程.环境: Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备: ...
- Linux Makefile文件编写详细步骤与实践
Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...
随机推荐
- JavaScript -获取屏窗与视窗、文档宽高
实例:1920*1080的电脑屏幕 1.获取窗口中的文档显示区域宽高 clientw = window.innerWidth; //1920(包含滚动条) clienth = window.inner ...
- hadoop笔记 基础 归档
核心:分布式存储和分布式计算 闲话: 底层基于socket通信 NIO——java异步io,不阻塞,不等待 bt——p2p软件(点对点传输,每个人既是上传者又是下载者.但是会占用大量网络带宽,所以很多 ...
- Pycharm选中代码无法Backspace直接删除
现象 如图,选中代码后,按习惯来说,直接Backspace就可以删除被选中代码. 但选中后再按“Backspace”,只会改变(扩选)选中范围. 解决 点击“工具栏”里的“Tool”,去掉勾选的Vim ...
- for and range()
pyhon 中 for 循环可以遍历任何序列的项目,如一个字典或者一个字符. for 循环格式一般如下: for <variable-变量> in <sequence-序列>: ...
- gevent For the Working Python Developer
Gevent指南 gevent程序员指南 由Gevent社区编写 gevent是一个基于libev的并发库.它为各种并发和网络相关的任务提供了整洁的API. 介绍 贡献者 核心部分 Greenle ...
- Sql server用QQ邮箱发送邮件
一.配置数据库邮件 https://jingyan.baidu.com/article/3ea51489a135f752e71bba5b.html
- [cocos2dx笔记006]流格式日志
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zdhsoft/article/details/36001945 在cocos2dx 2.2.2版本号 ...
- JVM虚拟机—JVM内存
JVM在运行时将数据划分为了5个区域来存储,这5个区域图示如下: 其中方法区和堆对是所有线程共享的内存区域:而java栈.本地方法栈和程序员计数器是运行时线程私有的内存区域. 首先我们熟悉一下一个 J ...
- 35个例子学会find
find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> - <指定目录>: 所要搜索的目录及其所有子目录.默认为当前目录. - ...
- 为Eclipse指定JVM
运行eclipse时,报如下错误时,可以通过修改配置文件eclipse.ini来解决. Version 1.4.1_01 of the JVM is not suitable for this pro ...