Makefile基础教程(变量的介绍和使用)

news2025/1/13 13:20:36

文章目录

  • 前言
  • 一、Makefile变量概念介绍
  • 二、Makefile中变量的赋值方式
    • 1.简单赋值
    • 2.递归赋值
    • 3.条件赋值
    • 4.追加赋值
  • 三、Makefile赋值在工程中的应用
  • 总结


前言

在C语言等语言中存在变量这个概念那么在Makefile中也是存在变量这个概念的,现在就让我们来学习一下什么是Makefile中的变量。

一、Makefile变量概念介绍

变量是在Makefile中被定义并被赋予特定的值或字符串,这些变量可以在整个Makefile中引用和使用。

在Makefile中定义变量,可以使Makefile更加灵活,便于维护和重复使用代码。变量通常用于存储文件名、目录路径、编译器选项等常用的定义,并且可以动态地用于自动构建步骤的指令中。

以下是一些Makefile变量的示例:

CC变量:用于指定编译器的类型
CC = gcc

CFLAGS变量:指定编译器选项(例如调试信息、优化等)
CFLAGS = -g -O2

SRC_FILES变量:用于指定源文件列表
SRC_FILES = main.c foo.c bar.c

OBJ_FILES变量:用于指定目标文件列表

二、Makefile中变量的赋值方式

1.简单赋值

简单赋值其实就是和我们在C语言当中使用 = 来赋值是一样的。
当我们要调用这个变量的使用可以使用$符号进行调用。

x := "hello"

all : 
	@echo "x => $x"

执行结果:
在这里插入图片描述

2.递归赋值

当使用递归赋值时其中一个变量的值被修改那么这个被赋值的值也会随之被修改。

x := hello
y = $(x)world
x := hi

all : 
	@echo "x => $(x)"
	@echo "y => $(y)"

执行结果:
在这里插入图片描述

3.条件赋值

条件赋值就是当一个变量没有进行定义时才能起作用。

x := hello
y = $(x)world
x := hi
z = test1
z ?= test

all : 
	@echo "x => $(x)"
	@echo "y => $(y)"
	@echo "z => $(z)"

执行结果:
在这里插入图片描述

4.追加赋值

追加赋值其实是非常好理解的,就是在原来变量的后面再加上赋的值,但是需要注意的就是追加的值和原来的值之间是会有一个空格隔开的。

x := hello
y = $(x)world
x := hi
z = test1
z ?= test
k := test11
k += Test

all : 
	@echo "x => $(x)"
	@echo "y => $(y)"
	@echo "z => $(z)"
	@echo "k => $(k)"

三、Makefile赋值在工程中的应用

这里我们使用赋值来改造一下我们之前写过的一个makefile,在这里使用了CC替代gcc,使用TARGET替代 hello。
当我们的编译器不是使用的gcc时我们只需要修改CC 这个变量的值即可,当要生成目标的文件名不是hello时修改TARGET变量的值即可。

CC := gcc
TARGET := hello

TARGET : hello.o func.o
	$(CC) -o TARGET hello.o func.o

hello.o : hello.c
	$(CC) -c -o hello.o hello.c

func.o : func.c
	$(CC) -c -o func.o func.c

.PHONY: clean rebuild all

rebuild : clean all

all : TARGET

clean :
	rm *.o TARGET

总结

Makefile中的变量在工程开发中是非常常用的,大家需要好好掌握和理解。

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

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

相关文章

Solr(5):Solr控制台说明-主面板

1 Dashboard(仪表盘) 访问 http://ip:8983/solr时,出现该主页面,可查看到solr运行时间、solr版本,系统内存、虚拟机内存的使用情况 这里的图片描述 2 Logging(日志) 显示solr运行出现的异常或错误 3 Core Admin (core管理) 主要有Add Cor…

Java--io流知识总结

什么是输入/输出流 Java 程序通过流来完成输入/输出,所有的输入/输出以流的形式处理。因此要了解 I/O 系统,首先要理解输入/输出流的概念。 输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好…

抢先微软,Google版Copilot上线!谷歌宣布给Google全家桶开放Bard功能

夕小瑶科技说 原创作者 | 智商掉了一地、兔子酱 就在本月 5 号,Bard 和 Google Workspace 同步更新了一则新闻,宣布 Workspace 的团队用户即日起可以申请体验由 Bard 大模型驱动的生成式 AI 工具。 这项计划在今年 3 月份首次公布,当时该工具…

上架Google play 提示 不符合64位版本应用的要求

此版本不符合 Google Play 关于提供 64 位版本应用的要求以下 APK 或 App Bundle 面向 64 位设备,但只有 32 位原生代码:[29]请向应用中添加64位和 32 位原生代码。使用 Android App Bundle 发布格式可自动确保每种设备架构仅收到所需加应用的总大小。 在build.gra…

HCIA-RS实验-路由配置-RIPv2 路由汇总和认证

RIPv2 路由汇总和认证简介: RIPv2 是一个距离向量路由协议,用于在网络中选择最佳路径。RIPv2 路由汇总和认证是两个重要的功能,可以提高路由协议的可靠性和安全性。 1. 路由汇总 路由汇总是将多个路由表项合并成一个较小的路由表项的过程。在…

vscode IDE 能用的上的扩展工具功能介绍

记录分享vscode扩展,包括提升开发效率。必备。主题美化。ChatGPT等。 参考 vscode-extensions [Best] 记录分享方式,整理自己用的扩展,还有一键备份和还原方法。 ⭐快速下载和使用扩展 后面会介绍很多vscode扩展.这裡有一个技巧,…

腾讯云2核2G4M轻量服务器带宽CPU流量系统盘性能测评

腾讯云轻量2核2G4M服务器自带4M公网带宽,下载速度可达512KB/秒,100%CPU性能,系统盘为50GB SSD盘,300GB月流量,折合每天10G流量,地域节点可选上海/广州/北京。腾讯云百科分享腾讯云轻量应用服务器2核2G4M配置…

【1++的Linux】之Linux常见指令(一)

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,ls指令二,pwd命令三,cd指令四,touch 指令五,mkdir指令六,rmdir指令 && rm 指令 一&#…

sensor的感光原理

文章内容来自网络,联系我可以删掉。 目录 CMOS sensor上有什么? 不同像素对应的图像质量: 像点感光原理: Bayer格式变换成RGB格式: CMOS sensor上有什么? CMOS sensor 通常由像敏单元阵列、行驱动器、…

mosn基于延迟负载均衡算法——走得更快,期待走得更稳 | 京东云技术团队

前言 这篇文章主要是介绍mosn在v1.5.0中新引入的基于延迟的负载均衡算法。 对分布式系统中延迟出现的原因进行剖析介绍mosn都通过哪些方法来降低延迟构建来与生产环境性能分布相近的测试用例来对算法进行验证 地址: https://github.com/mosn/mosn/pull/2253 在开…

python安装包遇到问题解决手册

问题描述: Windows安装 pip install pycocotools 出现问题。显示 error: Microsoft Visual C 14.0 or greater is required. Get it with "Microsoft C Build Tools": https://visualstudiomicrosoft.com/visual-cpp-build-tools/ 解决方法:…

力扣算题day16(树使用递归方法需要记住,都会遍历完整个树,叶子节点是整个递归的某次递归结束)

104、二叉树最大深度 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 测试代码: class TreeNode:def __init__(self, valNone, leftNone, rightNone):self.val valself.left leftself.right rightclass …

【Linux】缓存数据库Memcached

一、 什么是缓存 缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。 从性能分析: CPU缓存>内存>磁盘>数据库 从性能来看内存是介于CPU和磁盘,在实际中内存是CPU和磁盘的桥梁。buffer和cache…

【Linux】进程优先级PRI NI/并行与并发的概念

文章目录 基本概念为什么会有优先级?如何查看进程优先级?PRI and NI如何更改进程优先级?优先级vs权限并行与并发的概念 基本概念 CPU资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优…

C# 使用PdfiumViewer实现对PDF文档打印预览(二)

文章目录 前言关于PdfiumViewer配置PdfiumViewer环境PdfiumViewer 打开并预览本地的PDF文档PdfiumViewer 预览PDF文件流小节附录 前言 想要对PDF文档进行预览和打印,实际上这个文档可以是存在的,也可以是一个PDF文件流(本地并没有PDF文件&am…

家用洗地机哪个好用?家用洗地机分享

洗地机是一种代表现代化清洁的设备,它具有高效、环保、经济、智能等多种特点。洗地机可以为您提供先进的清洁技术和设备,为您的清洁工作提供有力的支持。洗地机可以适应不同场所和建筑物的需求,提高工作效率和卫生形象。因此,选择…

Dockerfile构建镜像读取环境变量问题

起初使用如下Dockerfile构建Java镜像&#xff1a; FROM 10.170.33.245/base/openjdk:11.0.6-jdk-slim-busterMAINTAINER luo.hq <luo.hqneusoft.com>ENV TZ "Asia/Shanghai" ENV TERM xterm ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 ENV JVM_OPTIONS ""…

CSS 径向渐变

background: radial-gradient([ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> ); 属性解析&#xff1a; ending-shape &#xff1a;渐变结束的形状 默认为椭圆ellipse&#xff0c;可以设置为圆形circle size&#xff1a;渐…

R语言 | 认识apply家族

目录 一、apply()函数 二、sapply()函数 三、lapply()函数 四、tapply()函数 ​五、iris鸢尾花数据集 R语言提供了一个循环系统称apply家族&#xff0c;它具有类似for循环的功能&#xff0c;但是若想处理相同问题&#xff0c;apply家族函数好用太多了。 一、apply()函数 …

隐藏加密文件夹怎么找到?看这里就够了!

当隐藏遇到加密&#xff0c;可以很好地保护电脑文件夹数据安全&#xff0c;那么隐藏加密的文件夹该怎么找到呢&#xff1f;方法其实很简单&#xff0c;下面我们通过两款提供文件夹隐藏加密的软件来了解一下。 文件夹加密超级大师 作为一款能够提供5种文件夹加密类型的软件&…