一个通用的makefile写法,自动推导文件的依赖关系

2.5 Makefile使用自动推导(附示例) 现在有main.ca.cb.ca.hb.h以下是构建的文件及其内容:这样,主程序main.c通过引用头文件a.h和b.h,分别调用了a.c中的print_a()函数和b.c中的print_b()函数。每个文件中都有相应的打印语句,以输出对应的文件名和所包含的文件。 阅读详情

 今天看了一天的makefile的写法,东拼西凑,好不容易写出了一个makefile,颇有成就感,记录下来,以备温习之用。

  假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录

写一个完整的makefile步骤如下:

1 定义可执行文件的名称

TARGET = MyPro

2 指定此编译工程所要使用的头文件所在的目录

INC = -I. -Iheader1 -Iheader2

3 指定cpp文件所在的目录

VPATH = .:src1:src2

4 指定所有的cpp文件

   SRC_PATH = $(foreach dir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/,*.cpp))

解释:

foreach,subst,wildcard为makefile的内置函数,其中wiilcard函数为字符串连接函数,把函数中的两个参数连接成一个。subst是字符串替换函数,在此句中意思是把VPATH变量中的冒号替换成空格。foreach函数,就是把subst函数的返回值,以空格为分隔符,循环取值赋给dir,然后接受wildcard的处理。

这句的总体意思是:从VPATH中获取每个目录,并分别找出此目录下所有的cpp文件,赋给SRC_PATH变量。

5 定义中间object文件存放的目录。

OBJ_DIR = ./obj

6 所有的object文件要按照和源代码对应的目录存放,定义object文件的目录

OBJ_PATH = $(addprefix $(OBJ_DIR)/,$(subst :, ,$(VPATH)))

解释:

addprefix函数是加前缀的函数,词句中是给VPATH中所有已经定义的目录加上./obj/的前缀。

7 定义连接成目标文件所需要的所有的object文件的名称

OBJS = $(addprefix $(OBJ_DIR),$(subst .cpp,.o,$(SRC_PATH)))

8 创建一个object文件的目录

MAKE_OBJECT_DIR := $(shell mkdir -p $(OBJ_DIR) $(OBJ_PATH))

9 定义实用的编译器

CXX = g++

CXXFLAGS = -g 

10 定义目标文件的生成规则

$(TARGET) : $(OBJS)

$(CXX) -o $@ $(OBJS) $(INC) $(CXXFLAGS)

11 定义object文件的生成方式:

$(OBJ_DIR)/%.o : %.cpp %.cpp.d

$(CXX) -o $@ -c $< $(INC) $(CXXFLAGS)

12 定义.cpp.d文件的生成方式

DEPS = $(OBJS:.o=.cpp.d)

$(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp

$(CXX) $< -MM $(INC) > $(OBJ_DIR)/$<.d

13 定义清理函数

clean:

@rm -rf ./obj

@rm -rf $(TARGET)

至此,一个通用的makefile完成了,如果增加源代码目录和头文件目录,只需要在INC变量和VPATH变量处加上此目录即可。中间object文件和文件的依赖关系自动生成。

用 AI 设计力打造专业 UI_UX:在 Trea、Qoder 等 AI IDE 中集成 ui-ux-pro-max-skill 的核心是知识库Trea 和 Qoder 虽未被--ai all原生支持,但完全可通过@folder手动集成使用后,你的 AI 生成代码将从“功能可用”跃升至“设计专业”这是零成本提升产品质感的最佳实践之一🎨好的 UI 不应是设计师的专利,而是每个开发者的默认能力。然后在 Trea 或 Qoder 中输入—— 让 AI 成为你最懂设计的结对编程伙伴。 阅读详情

相关推荐

Qt Creator设计器里也能拖拽?5步将你的QML自定义控件变成可视化插件(Qt6.5+)

本文详细介绍了如何在Qt Creator设计器中实现QML自定义控件的可视化拖拽功能(Qt6.5+)。通过5个步骤,从构建可插件化的QML控件基础到部署插件到设计器环境,帮助开发者将自定义控件转化为设计器插件,提升团队协作效率。特别适合需要频繁调整UI样式的开发场景。

weixin_29214559的博客 172

Makefile学习3 - foreach函数

Makefile foreach函数学习

to_be_better_wen的博客 3514

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

makefile中的foreach、patsubst、notdir、wildcard及自动化变量

在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件建立一个简单的。

m0_63893772的博客 422

Rockit VDEC解码实战:从零构建高效视频处理流水线

本文详细介绍了Rockit VDEC硬件解码模块在RK3568/RK3588平台的应用实践,涵盖开发环境配置、MPI接口使用、码流发送模式选择、内存管理优化及多路解码系统构建。通过实战案例展示如何利用VDEC实现高效视频处理流水线,显著降低CPU占用率,提升嵌入式多媒体开发效率。

ol789012的博客 305

深入解析YT8521S千兆以太网PHY芯片的设计与调试要点

本文深入解析了YT8521S千兆以太网PHY芯片的设计与调试要点。重点剖析了硬件设计中的电源方案、RGMII接口电平配置(尤其是1.8V电平方案)以及PCB布局布线等关键细节,并提供了从硬件检查、驱动配置到性能测试的完整调试流程,帮助工程师规避常见陷阱,实现稳定可靠的千兆网络连接。

weixin_29190573的博客 690

Linux之Makefile(foreach)

$(foreach VAR,LIST,TEXT) 函数功能:这个函数的工作过程是这样的:如果需要(存在变量或者函数的引用) , 1. 首先展开变量“VAR”和“LIST”的引用;而表达式“TEXT”中的变量引用不展开。 2. 执行时把“LIST”中使用空格分割的单词依次取出赋值给变量“VAR” ,然后执行“TEXT”表达式。重复直到“LIST”的最后一个单词(为空时结束) 。“TEXT”中的变量或者函数引用在执行时才被展开,因此如果在“TEXT”中存在对“VAR”的引用,那么“VAR”的值在每一..

u010783226的专栏 1169

【功能安全】【AutoSAR】程序流监控机制

目录 一、程序流执行的常见故障 二、程序流的监控机制 1、监控功能的实现 2、三种监督机制 a、生命监测机制 b、截止时间监测机制 c、逻辑程序流监测机制 一、程序流执行的常见故障 与程序流相关的故障,在ISO26262中第六章附录D中定义如下: — 执行阻塞; — 死锁; — 活锁; — 执行时间的不正确分配; — 软件要素间的不正确同步。 二、程序流的监控机制 1、监控功能的实现 AutoSAR中对程序流的监控功能的实现主要有“看门狗”栈(Watchdog Stack).

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4521

makefile

—这篇文章主要是记录常用的。

weixin_46829095的博客 888

CTK Plugin Framework插件框架学习1--Qt编译CTK

【代码】Qt编译CTK。

贝勒里恩的博客 7435

uniapp(全端兼容) - 实现点击输入框时完美顶起键盘,获取键盘高度动态计算顶起距离,解决软键盘弹出时输入框被覆盖问题,uniapp微信小程序/移动端h5网页/安卓苹果app(示例代码,一键复制

uniapp,支付宝微信小程序,移动端H5网页网站,软键盘弹出位置不对,软键盘挡住了输入框怎么办,获取键盘高度计算弹出距离,uniapp如何解决输入框input激活后键盘弹出遮挡问题,uniapp输入框偶尔被键盘遮挡,解决uniapp在App环境下输入框被软键盘遮挡的问题,uniapp 完美解决苹果和安卓input框遮挡兼容问题,uniapp输入框拉起软键盘时,输入框显示不全,被软键盘挡住一半,input被键盘遮挡的解决方案,软键盘遮挡输入框,uniapp软键盘顶不起来输入框,输入框没有被软键盘弹出来怎么办

✅ 精选推荐文章 1万+

一个通用的makefile写法,自动推导文件的依赖关系【转】

今天看了一天的makefile的写法,东拼西凑,好不容易写出了一个makefile,颇有成就感,记录下来,以备温习之用。      假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录  写一个完整的makefile步骤如下: 1 定义可执行文件的名称  TARGET = MyPro               

fei的专栏 2249

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

makefile文件中的依赖关系理解

首先,假设当前工程目录为prj/,该目录下有6个文件,分别是:main.c、abc.c、xyz.c、abc.h、xyz.h和Makefile。其中main.c包含头文件abc.h和xyz.h,abc.c包含头文件abc.h,xyz.c包含头文件xyz.h,而abc.h又包含了xyz.h。它们的依赖关系如图。 ...

JustDoIt_201603的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

详解自动化编译命令make及Makefile文件

编译Android或Linux源码时,我们会发现串口输入命令make后就会开始自动编译。make命令通过一个称为makefile的文件来完成并自动维护编译工作。输入make指令后将自动寻找当前目录下的makefile(或Makefile)文件并解析它完成编译工作,故我们需要重点理解makefile文件的语法。

kuocheng_xu的博客 2183

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

头文件和源文件在不同目录情况下 Makefile自动推导依赖关系的实现

参考 跟我一起写Makefile http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225&extra=&authorid=10610714&page=1 这两天

shun01的专栏 5711

Makefile与自动推导CMake

Makefile编写与Make工作原理 1.Makefile编写 我们知道,一个程序运行之前需要对程序中含有的文件先编译成中间代码文件,在Windows下也就是文件后缀为.obj的文件。在Linux下为.o文件(Linux下文件后缀是人为赋予的意义)。再进行链接,然后才能运行。但是,当一个程序需要很多文件时,我们在每一次需要运行时,都需要重新输入命令编译链接,这样做无疑很麻烦。于是便有了Makefile。当我们编写好Makefile后,只需要输入Make。就能实现程序的编译和链接。Makefile的编写,请

weixin_45738899的博客 2046

Linux基础学习笔记十一:Makefile依赖关系理解

一、前言 最近在看makefile,各文件之间的依赖关系整的我有点懵,看了好久还是迷迷糊糊,可能是我看的资料比较少。反正下面就通过一个例子逐渐引出自己的理解,完全是自己瞎琢磨,有错误欢迎指正!!! 一个简单的例子:4个.c文件,3个.h文件,其中mytest调用了test1,test2,test3;test1调用了test2,test3;test2调用了test3。 4个.c文件如下: 3个.h文件如下: 二、Makefile写法 1、最常规的写法: mytest: mytest.o test1.o

耐心的小黑的博客 6418

关于Makefile中模式规则,自动推导以及包含头文件

关于Makefile中模式规则,自动推导以及包含头文件 一、Makefile里有什么? Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。 1、显式规则。 显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。 2、隐晦规则。 由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较...

weixin_40769865的博客 2974

初识Linux —— make和makefile自动化构建工具

make。

LH__1314的博客 8062
上一篇: 关于程序设计的两个小小感受
下一篇: linux下输出标准错误的方法
zhsp1029
博客等级 码龄21年 115粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值