Makefile:通用部分头文件与条件判断(八)

news2024/12/28 4:17:10
1、通用部分做头文件

首先举个例子看看为什么需要这个东西,例如在一个文件夹下有两个项目,两个项目都需要编写makefile编译,此时可以使用公共头文件

目录结构如下:

在这里插入图片描述

1.1、项目(一)
  • 有a.cpp、b.cpp、c.cpp、d.cpp四个文件,对应的makefile长这个样子
src = $(wildcard ./*.cpp)
obj = $(patsubst ./%.cpp, ./%.o, $(src));
tar = d

$(tar): $(obj)
	${CXX} $^ -o $@

clean:
	${RM} $(tar) *.o

.PHONY: clean $(tar)
1.2、项目(二)
  • 有x.c、y.c、z.c四个文件,代码如下对应的makefile
src = $(wildcard ./*.c)
obj = $(patsubst ./%.c, ./%.o, $(src));
tar = z

$(tar): $(obj)
	${CXX} $^ -o $@

clean:
	${RM} $(tar) *.o

.PHONY: clean $(tar)
1.3、对比两个makefile
  • 对比上面两个makefile,其主要的不同就是一个项目下是.cpp文件,一个是.c文件,而下面编译的代码几乎相同

  • 因此可以通过makefile的手段来进行公共部分的提取

    • 项目一makefile

      tar = d
      
      include ../Makefile
      
    • 项目二makefile

      tar = z
      include ../Makefile
      
    • 新生成的makefile

      src = $(wildcard ./*.cpp ./*.c)
      obj = $(patsubst ./%.cpp,./%.o,$(src))
      obj:= $(patsubst ./%.c,./%.o,$(obj))
      
      $(tar):$(obj)
      	${CXX} $^ -o $@
      
      clean:
      	${RM} $(tar) *.o
      
      .PHONY: clean d
      
2、makefile中=与:=
  • 首先makefile在执行过程中会先对变量全部展开,最后在调用指令

  • 在makefile中存在=和:=这两种“赋值”操作,但是这二者是存在一定的差异的

    • =:可以理解为引用,可以在makefile中写一个a=$(a)的指令就会报出自身引用自身的错误

    • :=:可以理解为赋值,这个值只与当前行之前的变量值有关,先把值拿出来赋值好,后面在修改与其无关。

2.1、情况(一)
a=123
b=$(a)asd

show:
	@echo $(a)
	@echo $(b)

a=456

实际上这个makefile会变成下面这个情况

a=123
b=$(a)asd
a=456

show:
	@echo $(a)
	@echo $(b)
# 输出
# 456
# 456asd

而=被认为是引用,因此只有最后才知道值,a一旦修改b引用a的值也会被修改

2.2、情况(二)
a=123
b:=$(a)asd

show:
	@echo $(a)
	@echo $(b)

a=456

这种情况会被转化为下面这个情况

a=123
b:=$(a)asd
a=456

show:
	@echo $(a)
	@echo $(b)
# 输出
# 456
# 123asd

:=被认为是强制取值进行覆盖,所以赋值完毕之后的修改对b无效

2.3、练习
a=123
a:=$(a)
b=$(a)asd

show:
	@echo $(a)
	@echo $(b)

a=456
        
# 输出
首先a = 123,然后a:=$(a)表示强行赋值,a=123;然后b=$(a)asd这里是引用a,最后a修改成456,所以最后输出
456
456asd
3、条件判断
  • ifndef:if not definite的缩写
  • ifdef:if definite的缩写
  • else:否则
  • endif:结束if判断
tar=z
ifdef tar
tar:=main
else
tar:=main.o
endif

show:
	@echo $(tar)
# 输出  main
# 注释tar=z   输出  main.o


tar=z
ifndef tar
tar=main
endif
show:
	@echo $(tar)
	
# 输出:z
# 注释tar=z,输出:main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机安装银河麒麟

背景 由于Centos将于2024-06-30结束维护【脱保】,届时会存在Bug无人修复及功能无人开发等问题,所以要赶在这个节点前完成操作系统升级。可选的就是RedHat、Ubuntu以及国产信创【中标麒麟、银河麒麟、统信等】,或者使用云上操作系统【例如租阿…

嵌入式4-2

今日作业&#xff1a;使用文件IO 实现父进程向子进程发送信息&#xff0c;并总结中间可能出现的各种问题 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <fcntl.h> #include <unistd.h> int m…

C#中值类型与引用类型的存储

目录 值对象与引用对象的存储 引用对象的成员存储 值对象与引用对象的存储 数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置——栈或堆。 C#中类型分为两种&#xff1a;值类型和引用类型&#xff0c;这两种类型的对象…

YOLOv8全网独家改进: 小目标 | 注意力 |卷积和注意力融合模块(CAFMAttention) | 2024年4月最新成果

💡💡💡本文独家改进:卷积和注意力融合模块(CAFMAttention),增强对全局和局部特征的提取能力,2024年最新的改进思路 💡💡💡创新点:卷积和注意力巧妙设计 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect前面,增…

公司只有一个测试,要怎么继续呆下去?

在面试的时候&#xff0c;面试官可能会问&#xff1a;小公司、小团队&#xff0c;岗位就你一个人&#xff0c;怎么做 &#xff1f; 或者已经有的小伙伴已经在公司中面临只有一个测试的处境&#xff0c;这个时候我们应该怎么处理呢&#xff1f; 一 原因分析 公司只有一个测试人…

网易云首页单页面html+css

网页设计与网站建设作业htmlcss 预览 源码查看https://hpc.baicaitang.cn/2083.html

1999-2022年上市公司员工人数数据

1999-2022年上市公司员工人数数据 1、时间&#xff1a;1999-2022年 2、指标&#xff1a;证券代码、时间、员工人数 3、来源&#xff1a;整理自csmar 4、范围&#xff1a;上市公司 5、指标解释&#xff1a; 上市公司员工人数是衡量公司规模和发展状的重要指标。该数据直接…

4.2 JavaWeb Day05分层解耦

三层架构功能 controller层接收请求&#xff0c;响应数据&#xff0c;层内调用了service层的方法&#xff0c;service层仅负责业务逻辑处理&#xff0c;其中要获取数据&#xff0c;就要去调用dao层&#xff0c;由dao层进行数据访问操作去查询数据&#xff08;进行增删改查&…

Vision Pro开发实践(一)

简介 Vision Pro是苹果公司的首款头戴式“空间计算”显示设备&#xff0c;于2023年6月6日在“WWDC2023”正式发布&#xff0c;同时推出的还有专为Vision Pro打造的操作系统平台visionOS&#xff0c;以及一整套“新的”开发工具&#xff0c;之所以打引号&#xff0c;是因为用于…

Taro多行文本最多展示5行,超出“查看更多”展示,点击弹层

Taro中&#xff0c;页面需求&#xff1a; 多行文本&#xff0c;展示最多展示5行&#xff0c;超出5行&#xff0c;展示“查看更多”按钮&#xff0c;点击弹层展示文本详细信息。 弹层代码就不说了&#xff0c;着重说一下怎么获取区域高度&#xff5e; 1.区域设置max-height&am…

【AI绘画/作图】风景背景类关键词模板参考

因为ds官网被墙,所以翻了IDE的源码整理了下stablestudio里的官方模板&#xff0c;顺便每个模板生成了一份…不知道怎么写关键词的可以参考 Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic cloud…

java的警示之有危险的行为

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…

ssm016基于 Java Web 的校园驿站管理系统+jsp

校园驿站管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园快递信息管理混乱&#xff0c;出…

类和对象的下篇

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

从零实现一个Http服务器

HttpServer HTTPServer项目是一个基于C编写的简单的HTTP服务器实现&#xff0c;用于处理客户端的HTTP请求并提供相应的服务。该项目使用了Socket编程来实现服务器与客户端之间的通信&#xff0c;通过监听指定的端口并接受客户端连接&#xff0c;然后解析HTTP请求并生成对应的H…

新版Pubmed初识

PubMed基本检索操作指南。 PubMed和MEDLINE MEDLINE是美国国立医学图书馆&#xff08;The National Library of Medicine&#xff0c;NLM&#xff09;开发的国际性综合生物医学信息书目数据库&#xff0c;是当前国际上最权威的生物医学文献数据库。内容包括美国医学索引&…

通过提交容器的方式修改ubuntu镜像的apt源

通过提交容器的方式修改ubuntu镜像的apt源 步骤总结 问题&#xff0c;每次创建容器之后&#xff0c;都要在容器内手动更改镜像源。 不如&#xff0c;干脆修改镜像的apt源&#xff0c;一次到位。 步骤 先创建一个容器&#xff0c;到容器内执行变更命令。 D:/sandbox> dock…

Sora 基础作品之 DiT:Scalable Diffusion Models with Transformer

Paper name Scalable Diffusion Models with Transformers (DiT) Paper Reading Note Paper URL: https://arxiv.org/abs/2212.09748 Project URL: https://www.wpeebles.com/DiT.html Code URL: https://github.com/facebookresearch/DiT TL;DR 2022 年 UC Berkeley 出…

vue 移动端弹窗带滚动效果 滚动到底的时候弹窗下的页面会跟着滑动

<template><div class"wrap" :style"dynamicStyle"><!--dynamicStyle主要是介个 通过computed设置postion的值 弹窗的时候设置为fixed 关闭弹窗的时候设置为unset--><div class"banner-wrap"><img src"/assets/…

C语言一维数组及二维数组详解

引言&#xff1a; 小伙伴们&#xff0c;我发现我正文更新的有些慢&#xff0c;但相信我&#xff0c;每一篇文章真的都很用心在写的&#xff0c;哈哈&#xff0c;在本篇博客当中我们将详细讲解一下C语言中的数组知识&#xff0c;方便大家后续的使用&#xff0c;有不会的也可以当…