Makefile学习(一)[第二版]
简单介绍
1)make:利用 make 工具能够自己主动完毕编译工作。这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头文件被改动了,则又一次编译全部包含该头文件的源文件。利用这样的自己主动编译可大大简化开发工作,避免不必要的又一次编译。
2)Mackfile:make工具通过一个称为 Mackfile 的文件来完毕并自己主动维护编译工作。Mackfile文件描写叙述了整个project的编译、连接等规则。
Mackfile基本规则
Target ...: Dependencies ...
Command ...
说明:
1)目标(TARGET):即终于想要产生的文件。如:可运行文件,目标文件或中间文件等;目标也能够是要运行的动作,如clean,也称为伪目标。
2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。
3)命令(COMMAND):是make运行的动作(shell命令或是可在shell下运行的程序,如echo)。注意:每一个命令行的起始字符必须为TAB字符!
假设DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要运行,这就是Makefile最核心的内容.
简单的Mackfile演示样例
#1 最简单
hello:
gcc -o hello hello.c
#2 略微复杂
hello:hello.o
gcc -o hello hello.o
hello.o:
gcc -o hello.o -c hello.c
#3 进一步完好
hello:hello.o
gcc -o hello hello.o
hello.o:
gcc -o hello.o -c hello.c
clean:
rm -rf hello.o #delete file hello.o
#4 在Mackfile中运行shell命令[@符号:不输出命令本身]
hello:hello.o
gcc -o hello hello.o
@echo "--------------ok------------"
hello.o:
gcc -o hello.o -c hello.c
clean:
rm -rf hello.o #delete file hello.o
#5 综合[.PHONY:#显示声明伪目标]
.PHONY: clean
main: main.o sub.o add.o
gcc -Wall -g -o main main.o sub.o add.o
main.o: main.c
gcc -Wall -g -o main.o -c main.c
add.o: add.c add.h
gcc -Wall -g -o add.o -c add.c
sub.o: sub.c sub.h
gcc -Wall -g -o sub.o -c sub.c
clean:
rm -f main.o sub.o add.o
运行:
1)make #生成第一个目标
2)make clean #“生成”clean伪目标
3)make main.o #仅生成main.o目标
4)make -f Mackfile #显示指定运行的文件名称
Makefile变量
为了简化和维护Mackfile,能够在Mackfile中使用变量,格式
varname=some_text
引用变量的值:$(varname)
依照惯例,在Mackfile中,变量一般大写
|
Makefile自己主动化变量 |
|
|
选项名 |
作用 |
|
$@ |
规则的目标文件名称 |
|
$< |
规则的第一个依赖文件名称 |
|
$^ |
规则的全部依赖文列表 |
|
$* |
不包含后缀名的当前依赖文件名称 |
|
$? |
当前目标所依赖的文件列表中比当前目标文件还要新的文件 |
#综合演示样例
.PHONY: clean
.SUFFIXES: .c .o
.c.o:
gcc -Wall -g -o $@ -c $^
OBJECTS = main.o sub.o add.o
SOURCES = $(OBJECTS:.o=.c)
main: $(OBJECTS)
gcc -Wall -g -o $@ $^
clean:
@echo "delete execute file and object file..."
rm -f $(OBJECTS) main
附-
.SUFFIXES:.c .o #表示不论什么x.c文件与x.o文件关联
Make使用隐含推导规则/生成多个可运行文件
#演示样例-生成多个可运行文件1
.PHONY: clean all
BIN = 01test 02test
all: $(BIN)
clean:
-rm -f $(BIN)
#演示样例-生成多个可运行文件2-使用自己定制的规则,生成.o中间文件
.PHONY: clean all
BIN = 01test 02test
OBJECTS = $(BIN:=.o)
all: $(BIN)
01test.o: 01test.c
02test.o: 02test.c
clean:
-rm -f $(BIN) $(OBJECTS)
#演示样例-生成多个可运行文件3-使用更加仔细的规则
.PHONY: clean all
CFLAGS = -g -Wall
CC = gcc
BIN = 01test 02test
OBJECTS = $(BIN:=.o)
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
all: $(BIN)
01test.o: 01test.c
02test.o: 02test.c
clean:
-rm -f $(BIN) $(OBJECTS)
模式规则与后缀规则
%.o:%.c
.c.o:
#演示样例
.PHONY: clean all
CC = gcc
CFLAGS = -Wall -g
BIN = 01test 02test
SOURCES = $(BIN:=.c)
OBJECTS = $(BIN:=.o)
all: $(BIN)
01test: 01test.o
02test: 02test.o
#%.o: %.c #模式规则
# $(CC) $(CFLAGS) -c $< -o $@
.c.o: #后缀规则,与前作用同样
$(CC) $(CFLAGS) -c $< -o $@
clean:
-rm -rf $(BIN) $(OBJECTS)
Makefile学习(一)[第二版]的更多相关文章
- Makefile学习(二)[第二版]
复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...
- Makefile学习(三)[第二版]
make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...
- TensorFlow 深度学习中文第二版·翻译完成
原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...
- gcc学习(一)[第二版]
gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C Compiler),作者为Richard Stallman,是GNU项目的奠基者 ...
- gdb学习(一)[第二版]
概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...
- gdb学习(二)[第二版]
查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype ...
- gcc学习(二)[第二版]
头文件与库文件 1.概要 在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的.它 ...
- 《Java程序设计与数据结构教程(第二版)》学习指导
<Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...
- Learning ROS for Robotics Programming - Second Edition(《学习ROS机器人编程-第二版》)
Learning ROS for Robotics Programming - Second Edition <学习ROS机器人编程-第二版> ----Your one-stop guid ...
随机推荐
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 在C#中子线程如何操作主窗口线程上的控件
在C#中子线程怎样操作主线程中窗口上控件 在C#中,直接在子线程中对窗口上的控件操作是会出现异常,这是因为子线程和运行窗口的线程是不同的空间,因此想要在子线程来操作窗口上的控件.是不可能简单的通过控件 ...
- hdu 5056Boring count
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5056 题目大意:就是问在子串中每一个小写字母出现次数不超过k次的个数,注意子串是连续的子串.. . ...
- Hdu 4734 【数位DP】.cpp
题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...
- .Net 文本框实现内容提示(仿Google、Baidu)
原文:.Net 文本框实现内容提示(仿Google.Baidu) 1.Demo下载: 文本框实现内容提示(仿Google.Baidu).rar 2.创建数据库.表(我用的sqlserver2008数据 ...
- [置顶] Guava学习之Multimap
相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知道,Map中存储的Key是唯一的.什么意思呢?就是假如我们有 ...
- VS2010添加默认路径,库以及Lib
下面以OpenCV为例,不需要每次打开VS2010都手动添加OpenCV的库和lib,具体方法如下: VC++目录 步骤一:用任意文本编辑器打开: VS安装目录中的\VC\VCWizards\def ...
- U7Linux文件与目录管理
1. .:代表当前层目录. ..:代表上一层目录. -:代表前一个工作目录. ~:代表目前用户所在的主文件夹. ~account:代表account这个用户的主文件夹. 2.pwd:显示当前目录. p ...
- 大话设计模式C++达到-文章12章-外观模式
一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...
- SDL2源码分析8:视频显示总结
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...