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 = ...
- Makefile学习(一)[第二版]
简单介绍 1)make:利用 make 工具能够自己主动完毕编译工作.这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头 ...
- TensorFlow 深度学习中文第二版·翻译完成
原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...
- gdb学习(二)[第二版]
查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype ...
- gcc学习(一)[第二版]
gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C Compiler),作者为Richard Stallman,是GNU项目的奠基者 ...
- gdb学习(一)[第二版]
概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...
- gcc学习(二)[第二版]
头文件与库文件 1.概要 在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的.它 ...
- 锋利的jQuery(第二版)学习总结
通过对<锋利的jQuery>(第二版)一书的学习,发现此书讲解通俗易懂,是学习jQuery的一本很好的指导书,特作如下总结. 此书主要讲解了jQuery的常用操作,包括认识jQuery,j ...
- Learning ROS for Robotics Programming - Second Edition(《ROS机器人编程学习-第二版》)
Learning ROS for Robotics Programming - Second Edition <ROS机器人编程学习-第二版> ----Your one-stop guid ...
随机推荐
- iOS学习笔记--数据存储
iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 1. XM ...
- Android Multimedia框架总结(二十一)MediaCodec中创建到start过程(到jni部分)
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53386117 我最近正在参加CS ...
- Android app内存管理的16点建议
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiopshared memory(共享内存) Android通过下面几个方式在不同的Process中来共享RAM: 每一个app的proc ...
- springMVC源码分析--@ModelAttribute使用及运行原理
这一篇博客我们简单的介绍一下ModelAttribute的使用和运行原理. 1.首先@ModelAttribute是使用在方法或者上的,当使用在方法上时其作用于本身所在的Controller,在访问C ...
- ORACLE异常(整理网上资料)
一.oracle预定义异常 命名的系统异常 产生原因 Oracle Error SQLCODE Value ACCESS_INTO_NULL 未定义对象 ORA-06530 -6530 CASE_N ...
- PGM:无向图模型:马尔可夫网
http://blog.csdn.net/pipisorry/article/details/52489321 马尔可夫网 马尔可夫网在计算机视觉领域通常称为马尔可夫随机场(Markov random ...
- 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用
1 打开建好的T32 Cocos2dx-3.2的一个项目 2 设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3 设置自适应窗口大小的代码是在上面的 ...
- JAVA面向对象-----final关键字
JAVA面向对象-–final关键字 1:定义静态方法求圆的面积 2:定义静态方法求圆的周长 3:发现方法中有重复的代码,就是PI,圆周率. 1:如果需要提高计算精度,就需要修改每个方法中圆周率. 4 ...
- 字符编码(ASCII、ANSI、GB2312、UTF-8等)系统梳理
引言 在显示器上看见的文字.图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大,会看见盘片表面凹凸不 ...
- Team Foundation Server 2015 Update 2.1 发布日志
微软在 2016年5月5日发布了Visual Studio Team Foundation Server 2015 update 2.1. 下面我们来看看Update2.1中给我们带来了哪些新功能. ...