Makefile学习(三)[第二版]

简介: make常用内嵌函数1、函数调用   $(function arguments) #$引用的结果就是函数生成的结果 2、Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当前目录下的文件 例如:src=$(wildcard *.

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~



目录
相关文章
|
传感器 存储 边缘计算
3000字11张图硬核科普:什么是边缘计算?与云计算有什么联系和区别?
边缘计算是 现代IT 网络架构的一种创新的、革命性的方法,计算处理去中心化并在靠近数据源的网络“边缘”执行它,数据不再发送到云或任何单个数据处理中心,而是被发送到靠近传感器或生成此数据的设备数据源,极大的提高了数据的处理速度,节省了大量的带宽,还提高了数据的安全性。
1379 0
3000字11张图硬核科普:什么是边缘计算?与云计算有什么联系和区别?
|
10月前
|
弹性计算 关系型数据库 数据库
自建数据库迁移到云数据库实操
本课程详细介绍了自建数据库迁移到阿里云RDS的实操步骤。主要内容包括:创建实例资源、安全设置、配置自建的MySQL数据库、数据库的迁移、从自建数据库切换到RDS以及清理资源。通过这些步骤,学员可以掌握如何将自建数据库安全、高效地迁移到云端,并确保应用的正常运行。
480 26
|
11月前
|
人工智能 小程序 搜索推荐
uni app下开发AI运动小程序解决方案
本文介绍了在小程序中实现AI运动识别的解决方案。该方案依托于UNI平台,通过高效便捷的插件形式,实现包括相机抽帧控制、人体识别、姿态识别等在内的多项功能,无需依赖后台服务器,大幅提高识别效率和用户体验。方案内置多种运动模式,支持自定义扩展,适用于AI健身、云上赛事、AI体测等多场景,适合新开发和存量改造项目。
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
Kubernetes Nacos 微服务
【技术难题破解】Nacos v2.2.3 + K8s 微服务注册:强制删除 Pod 却不消失?!7步排查法+实战代码,手把手教你解决Nacos Pod僵死问题,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但有时会遇到“v2.2.3 k8s 微服务注册nacos强制删除 pod不消失”的问题。本文介绍此现象及其解决方法,帮助开发者确保服务稳定运行。首先需检查Pod状态与事件、配置文件及Nacos配置,确认无误后可调整Pod生命周期管理,并检查Kubernetes版本兼容性。若问题持续,考虑使用Finalizers、审查Nacos日志或借助Kubernetes诊断工具。必要时,可尝试手动强制删除Pod。通过系统排查,通常能有效解决此问题。
388 0
|
11月前
|
人工智能 编解码 算法
MVPaint:腾讯PCG联合多所高校共同推出的3D纹理生成框架
MVPaint是由腾讯PCG联合多所高校共同推出的3D纹理生成框架,基于同步多视角扩散技术,实现高分辨率、无缝且多视图一致的3D纹理生成。该框架包含三个核心模块:同步多视角生成、空间感知3D修补和UV细化,显著提升3D模型的纹理生成效果。
200 2
MVPaint:腾讯PCG联合多所高校共同推出的3D纹理生成框架
|
Web App开发 缓存 前端开发
【Flutter前端技术开发专栏】Flutter中的性能优化与内存管理
【4月更文挑战第30天】本文探讨了Flutter应用的性能优化和内存管理。关键点包括:减少布局重绘(使用`const`构造函数和最小化依赖),选择合适的动画实现,懒加载和按需加载以提升性能。同时,强调了避免内存泄漏和优化内存使用,利用Flutter提供的性能分析工具。实践案例展示了如何优化ListView,包括使用`ListView.builder`和缓存策略。通过这些方法,开发者可以提升应用的响应性、流畅性和稳定性。
609 0
【Flutter前端技术开发专栏】Flutter中的性能优化与内存管理
|
人工智能 JSON 数据格式
Dify开发工作流
这篇文章详细介绍了如何使用Dify平台进行工作流的创建与配置,包括设置变量、条件分支以及集成不同工具和服务来自动化任务处理流程。
3547 1
Dify开发工作流
|
人工智能 API 网络架构
【AI大模型应用开发】【LangChain系列】7. LangServe:轻松将你的LangChain程序部署成服务
【AI大模型应用开发】【LangChain系列】7. LangServe:轻松将你的LangChain程序部署成服务
487 0
|
12月前
|
数据可视化 搜索推荐 BI
哪些任务进度管理器值得推荐?几款工具使用测评
在快节奏的工作环境中,任务进度管理器成为提高效率和协作的关键工具。本文介绍了三款高效实用的管理软件:板栗看板、Trello 和 Asana。这些工具不仅帮助用户更好地规划和跟踪项目进度,还能确保任务按时完成。板栗看板以其直观的看板和灵活的自定义选项受到青睐;Trello 通过丰富的插件和跨平台支持,成为全球广泛使用的工具;Asana 则以强大的功能和灵活的工作流管理,适合大型企业和复杂项目的管理需求。用户可根据自身需求选择合适的工具,提高团队协作效率,达成项目目标。