简介

1)make:利用 make 工具可以自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件[make通过比对相应的.c文件与.o文件的时间];如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。

2)Mackfile:make工具通过一个称为 Mackfile 的文件来完成并自动维护编译工作。Mackfile文件描述了整个工程的编译、连接等规则。

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学习(一)[第二版]相关推荐

  1. Makefile学习(二)[第二版]

    复杂实例 #示例1:在上一个示例的基础上再增加一个可执行文件03test[修改之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = 01t ...

  2. Makefile学习(三)[第二版]

    make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...

  3. TensorFlow 深度学习中文第二版·翻译完成

    原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...

  4. TensorFlow 深度学习中文第二版(初稿)

    TensorFlow 深度学习中文第二版 第 1 章深度学习入门 人工神经网络 ANN 如何学习? 神经网络架构 深度学习框架 总结 第 2 章 TensorFlow 的首次观察 TensorFlow ...

  5. 李沐d2l《动手学深度学习》第二版——风格迁移源码详解

    本文是对李沐Dive to DL<动手学深度学习>第二版13.12节风格迁移的源码详解,整体由Jupyter+VSCode完成,几乎所有重要代码均给出了注释,一看就懂.需要的同学可以在文末 ...

  6. 李沐《动手学深度学习》第二版比赛2-Classify Leaves

    李沐<动手学深度学习>第二版比赛2-Classify Leaves 我的偶像,李沐大神主讲的<动手学深度学习>(使用Pytorch框架,第一版使用的是MXNet框架)目前已经进 ...

  7. 李沐《动手学深度学习》第二版 pytorch笔记1 环境搭建

    李沐<动手学深度学习>第二版pytorch笔记1 搭建环境 文章目录 李沐<动手学深度学习>第二版pytorch笔记1 搭建环境 此时尚有耐心 虚拟环境搭建 创建虚拟环境 查看 ...

  8. 《精通labview教程——由浅入深的范例学习(第二版)》课后题答案

    <精通labview教程--由浅入深的范例学习(第二版)>课后题答案,[美]John Essick著,[译]邓科等 课后题答案偶数部分是教程自带答案,奇数题目是自制答案 下载链接: 第一章 ...

  9. 强化学习圣经第二版阅读记录

    最近开始认真阅读强化学习圣经第二版,本文先记录一下用到的资料: 圣经原版:http://incompleteideas.net/book/the-book-2nd.html 圣经中文翻译版:http: ...

最新文章

  1. 佐治亚理工学院计算科学与工程系博士生招生!
  2. SAP QM 执行事务代码QA11 报错- Selected set code does not exist, or data entered is incomplete-
  3. IOS开发 使用CGContextRef绘制文字时的设置
  4. 对话Nullmax无人车CEO徐雷:造血营收L3,追梦宏图L4
  5. 【MaxCompute】学习笔记基础说明
  6. Spring事务处理时自我调用的解决方案及一些实现方式的风险
  7. CSS之使用display:inline-block布局
  8. 电脑硬件检测_好用的电脑硬件型号有哪些_江西南昌顺同谦科技|电脑||笔记本|...
  9. 今天整理了短距离传输技术的比较!有用得到的,请拿走不谢!
  10. infoseccrypto_java下载_關於php接ICBC的支付接口的解決方案
  11. mysql 数据库引擎介绍_MYSQL 数据库引擎介绍
  12. 海南大学计算机原理,海南大学微机原理课件 第一章 计算机基础知识
  13. how to make milt-Lang windows installer All in 1
  14. net4.0的从客户端中检测到有潜伏危险的 Request.Form
  15. YOLOv5的详细使用教程,以及使用yolov5训练自己的数据集
  16. 易语言精益模块json_精易模块|精易模块下载 v3.46 官方免费版_最火软件站
  17. C51单片机实验——矩阵按键
  18. Photoshop 2022下缩放和平移图像
  19. JS时间增加2个小时
  20. 手把手和你用原生JS写一个循环播放图片轮播

热门文章

  1. (数据库系统概论|王珊)第九章关系查询与关系优化:习题
  2. 推动Windows的限制:USER和GDI对象 - 第2部分
  3. USACO-Section1.4 Ski Course Design (枚举)
  4. windows10环境下载labelImg及使用方法
  5. 排序算法:冒泡排序算法优化实现及分析
  6. 【洛谷1341】无序字母对(欧拉回路)
  7. Android开发 ---如何操作资源目录中的资源文件2
  8. centos7 安装webmin
  9. mysql服务器设置其他电脑访问
  10. 想念一个人是一种温馨,被别人想念是一种幸福