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 = ...

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

    简单介绍 1)make:利用 make 工具能够自己主动完毕编译工作.这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头 ...

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

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

  4. gdb学习(二)[第二版]

    查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype  ...

  5. gcc学习(一)[第二版]

    gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C  Compiler),作者为Richard Stallman,是GNU项目的奠基者 ...

  6. gdb学习(一)[第二版]

    概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...

  7. gcc学习(二)[第二版]

    头文件与库文件 1.概要 在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的.它 ...

  8. 锋利的jQuery(第二版)学习总结

    通过对<锋利的jQuery>(第二版)一书的学习,发现此书讲解通俗易懂,是学习jQuery的一本很好的指导书,特作如下总结. 此书主要讲解了jQuery的常用操作,包括认识jQuery,j ...

  9. Learning ROS for Robotics Programming - Second Edition(《ROS机器人编程学习-第二版》)

    Learning ROS for Robotics Programming - Second Edition <ROS机器人编程学习-第二版> ----Your one-stop guid ...

随机推荐

  1. Linux文件编辑命令详细整理

    刚接触Linux,前几天申请了个免费体验的阿里云服务器,选择的是Ubuntu系统,配置jdk环境变量的时候需要编辑文件. vi命令编辑文件,百度了一下,很多回答不是很全面,因此编辑文件话了一些时间. ...

  2. 剑指Offer——常用SQL语句、存储过程和函数

    剑指Offer--常用SQL语句.存储过程和函数 常用SQL语句 1.在MySQL数据库建立多对多的数据表关系 2.授权.取消授权 grant.revoke grant select, insert, ...

  3. C++ 虚函数表 单继承

    本文研究单继承情况下,c++对象的虚函数表的具体情况. 假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2. 测试的代码如下: #include<iostrea ...

  4. Spark技术内幕:Sort Based Shuffle实现解析

    在Spark 1.2.0中,Spark Core的一个重要的升级就是将默认的Hash Based Shuffle换成了Sort Based Shuffle,即spark.shuffle.manager ...

  5. [django]用fastcgi部署

    django官方已经开始弃用fastcgi来部署django应用了,作为以前使用过的用户,还是贴一个配置,用来做纪念吧.. 项目下 #! /bin/sh case "$@" in ...

  6. FORM执行查询的各种方法

     一.FORM调用FORM后执行查询 1.打开 APPSTAND.fmb,把 Object Groups 下的 QUERY_FIND 对象组拖动到自己的 form 中的 Object Groups ...

  7. iOS开发之Xcode常用调试(Debug)技巧总结

    一.Xcode调试技巧之:NSLog 上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log.而在OC语言中,打Log是采用NSLog方法.但是NSLog效率低下,具体原因可以看这篇博 ...

  8. antlr v4 使用指南连载2——准备环境

    antlr v4 开发环境         从上一篇文章的例子中可以知道,antlr有一套自己的语法来声明目标语言的语法,因此它本身就需要编译或者使用antlr提供的api来读取这些语法规则,并使之可 ...

  9. 剑指Offer——二叉树

    剑指Offer--二叉树 前言 数据结构通常是编程面试中考察的重点.在参加面试之前,应聘者需要熟练掌握链表.树.栈.队列和哈希表等数据结构,以及它们的操作.本片博文主要讲解二叉树操作的相关知识,主要包 ...

  10. Github上怎么修改别人的项目并且提交给原作者!图文并茂!

    Github上怎么修改别人的项目并且提交给原作者!图文并茂! 写这篇博客的初衷,是因为我的项目Only需要一些朋友一起参与进来,但是很多的Git都不是很熟练,其实版本控制这种东西没有什么难度的,只要稍 ...