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

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

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

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

    简介 1)make:利用 make 工具可以自动完成编译工作.这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件[make通过比对相应的.c文件与.o文件的时间];如果某个头文件被修改了 ...

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

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

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

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

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

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

  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. mysql的join语句使用_在MySQL中使用JOIN语句进行连接操作的详细教程
  2. 可靠消息最终一致性设计_如何最终启动您的设计产品组合
  3. 数独java界面基础_java版数独游戏界面实现(二)
  4. flutter 序列化_如何在Flutter中序列化对象
  5. 哈工大大数据实验_大数据创新实验室丨警大智慧警务学院人才培养打造新引擎...
  6. 计算机绘图实训任务书,autocad模块化实训任务书-2011.11
  7. koa2 session mysql_koa2+vue+axios搭建一个博客台管理系统之session踩坑
  8. sqlite3数据库报错:“打不开数据库文件”
  9. PLSQL Developer使用
  10. 百度如流首发AI智能办公标准 ,BATH持续发力企业办公
  11. java面试逻辑题_精选程序员面试常问的逻辑题
  12. URL中经常出现的百分号22是什么意思
  13. Windows下usb接口驱动技术(一)
  14. vue+elementUI动态生成表格列
  15. php约束性别默认为男,在表单中包含性别选项,且默认状态为“男”被选中,下列正确的是( )...
  16. Centos 修改 DNS 怎样生效
  17. D:\anaconda3\envs\py2\python.exe: can‘t open file ‘create‘: [Errno 2] No such file or directory
  18. 主板上还剩啥?CPU整合GPU/北桥/南桥
  19. 写一段有趣的科普文来介绍鲫鱼
  20. ssm高校党员信息管理系统

热门文章

  1. (王道408考研操作系统)第三章内存管理-第一节7:非连续分配管理方式之基本分段管理方式
  2. (计算机组成原理)第三章存储系统-第六节4:Cache的写策略(写回法和全写法,写分配法和非写分配法)
  3. python中获取目录下所有文件名以及读取一个文件内的每一行
  4. USACO-Section1.3 Palindromic Squares (进制转换和回文数)
  5. 数据相关,资源相关,控制相关的解决方法
  6. CSRF攻击原理与防御方法
  7. matlab实现非线性规划
  8. windows安装composer方法和使用方法
  9. CentOS7 Minimal 安装后出现的若干问题解决办法
  10. 头指针与头结点的异同