Makefile学习(三)[第二版]
make常用内嵌函数
1、函数调用
$(function arguments) #$引用的结果就是函数生成的结果
2、Makefile下常用的函数
1)$(wildcard PATTERN) #匹配当前目录下的文件
例如:src=$(wildcard *.c) #匹配当前目录下所有的.c文件
2)$(patsubst PATTERN,REPLACEMENT,TEXT) #模式替换函数
例如:$(patsubst %.c,%.o,$src) #等价于$(src:%.c=%.o)[常用]
3)shell函数,执行shell命令
例如:$(shell ls –d */)
多级目录Makefile
#示例1-所有的编译均由主目录下的Makefile完成
CC = gcc
CFLAGS = -Wall -g
BIN = main
SUBDIR = $(shell ls -d */) #SUBDIR保存了当前目录下的子目录
ROOTSRC = $(wildcard *.c) #ROOTSRC保存了当前目录下的.c文件
ROOTOBJ = $(ROOTSRC:%.c=%.o) #ROOTOBJ保存了将ROOTSRC中.c替换为.o文件之后的结果
SUBSRC = $(shell find $(SUBDIR) -name '*.c') #SUBSRC保存了所有子目录下的所有.c文件
SUBOBJ = $(SUBSRC:%.c=%.o) #SUBOBJ保存了将SUBSRC中.c替换为.o文件之后的结果
$(BIN):$(ROOTOBJ) $(SUBOBJ)
$(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@ #将所有的.c生成.o文件
clean:
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
#示例2-各个子目录下都有想对应的Makefile文件,各个子目录负责相应的编译工作
DIRS = lib intro sockets advio daemons datafiles db environ \
fileio filedir ipc1 ipc2 proc pty relation signals standards \
stdio termios threadctl threads printer exercises
all:
for i in $(DIRS); do \
(cd $$i && echo "making $$i" && $(MAKE) ) || exit 1; \
done
clean:
for i in $(DIRS); do \
(cd $$i && echo "cleaning $$i" && $(MAKE) clean) || exit 1; \
done
生成分布在多个目录下的可执行文件
#每个子目录都需要生成一个可执行文件,当前目录的结构如下图
#各个文件的内容如下
//test1/test1.c
#include <stdio.h>int main()
{printf("Hello !\n");return 0;
}
#test1/Makefile
.PHONY: all clean print
CC = gcc
CFLAGS = -Wall -g
BIN = test1
SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:%.c=%.o)
all: print $(BIN)
print:
@echo "----- make all in $(PWD) -----"
$(BIN): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^
#$(OBJECTS): $(SOURCES)
%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<
clean:
@echo "---- make clean in $(PWD) -----"
-rm -rf $(BIN) $(OBJECTS)
//test2/test2.cpp
#include <iostream>
using namespace std;int main(void)
{cout << "World!" << endl;
}
#test2/Makefile
.PHONY: clean all print
CXX = g++
CPPFLAGS = -Wall -g
BIN = test2
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
all: print $(BIN)
print:
@echo "----- make all in $(PWD) -----"
$(BIN): $(OBJECTS)
$(CXX) $(CPPFLAGS) -o $@ $<
%.o: %.cpp #可以省略该行以及下面一行
$(CXX) $(CPPFLAGS) -o $@ -c $<
clean:
@echo "----- make clean in $(PWD) -----"
-rm -rf $(BIN) $(OBJECTS)
#Makefile-在主目录下
SUBDIR = $(shell /bin/ls -d */)
.PHONY: default all clean $(SUBDIR)
default: all
all clean:
$(MAKE) $(SUBDIR) TARGET=$@
$(SUBDIR):
$(MAKE) -C $@ $(TARGET)
#执行make之后的结果
#执行后的目录结构图
增添了好多文件[.o 和 可执行文件]
#执行make clean的结果
#执行之后的结构图
恢复原样O(∩_∩)O~
Makefile学习(三)[第二版]相关推荐
- Makefile学习(二)[第二版]
复杂实例 #示例1:在上一个示例的基础上再增加一个可执行文件03test[修改之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = 01t ...
- Makefile学习(一)[第二版]
简介 1)make:利用 make 工具可以自动完成编译工作.这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件[make通过比对相应的.c文件与.o文件的时间];如果某个头文件被修改了 ...
- TensorFlow 深度学习中文第二版·翻译完成
原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...
- 李沐d2l《动手学深度学习》第二版——风格迁移源码详解
本文是对李沐Dive to DL<动手学深度学习>第二版13.12节风格迁移的源码详解,整体由Jupyter+VSCode完成,几乎所有重要代码均给出了注释,一看就懂.需要的同学可以在文末 ...
- TensorFlow 深度学习中文第二版(初稿)
TensorFlow 深度学习中文第二版 第 1 章深度学习入门 人工神经网络 ANN 如何学习? 神经网络架构 深度学习框架 总结 第 2 章 TensorFlow 的首次观察 TensorFlow ...
- 李沐《动手学深度学习》第二版比赛2-Classify Leaves
李沐<动手学深度学习>第二版比赛2-Classify Leaves 我的偶像,李沐大神主讲的<动手学深度学习>(使用Pytorch框架,第一版使用的是MXNet框架)目前已经进 ...
- 李沐《动手学深度学习》第二版 pytorch笔记1 环境搭建
李沐<动手学深度学习>第二版pytorch笔记1 搭建环境 文章目录 李沐<动手学深度学习>第二版pytorch笔记1 搭建环境 此时尚有耐心 虚拟环境搭建 创建虚拟环境 查看 ...
- 《精通labview教程——由浅入深的范例学习(第二版)》课后题答案
<精通labview教程--由浅入深的范例学习(第二版)>课后题答案,[美]John Essick著,[译]邓科等 课后题答案偶数部分是教程自带答案,奇数题目是自制答案 下载链接: 第一章 ...
- 强化学习圣经第二版阅读记录
最近开始认真阅读强化学习圣经第二版,本文先记录一下用到的资料: 圣经原版:http://incompleteideas.net/book/the-book-2nd.html 圣经中文翻译版:http: ...
最新文章
- mysql的join语句使用_在MySQL中使用JOIN语句进行连接操作的详细教程
- 可靠消息最终一致性设计_如何最终启动您的设计产品组合
- 数独java界面基础_java版数独游戏界面实现(二)
- flutter 序列化_如何在Flutter中序列化对象
- 哈工大大数据实验_大数据创新实验室丨警大智慧警务学院人才培养打造新引擎...
- 计算机绘图实训任务书,autocad模块化实训任务书-2011.11
- koa2 session mysql_koa2+vue+axios搭建一个博客台管理系统之session踩坑
- sqlite3数据库报错:“打不开数据库文件”
- PLSQL Developer使用
- 百度如流首发AI智能办公标准 ,BATH持续发力企业办公
- java面试逻辑题_精选程序员面试常问的逻辑题
- URL中经常出现的百分号22是什么意思
- Windows下usb接口驱动技术(一)
- vue+elementUI动态生成表格列
- php约束性别默认为男,在表单中包含性别选项,且默认状态为“男”被选中,下列正确的是( )...
- Centos 修改 DNS 怎样生效
- D:\anaconda3\envs\py2\python.exe: can‘t open file ‘create‘: [Errno 2] No such file or directory
- 主板上还剩啥?CPU整合GPU/北桥/南桥
- 写一段有趣的科普文来介绍鲫鱼
- ssm高校党员信息管理系统
热门文章
- (王道408考研操作系统)第三章内存管理-第一节7:非连续分配管理方式之基本分段管理方式
- (计算机组成原理)第三章存储系统-第六节4:Cache的写策略(写回法和全写法,写分配法和非写分配法)
- python中获取目录下所有文件名以及读取一个文件内的每一行
- USACO-Section1.3 Palindromic Squares (进制转换和回文数)
- 数据相关,资源相关,控制相关的解决方法
- CSRF攻击原理与防御方法
- matlab实现非线性规划
- windows安装composer方法和使用方法
- CentOS7 Minimal 安装后出现的若干问题解决办法
- 头指针与头结点的异同