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

简介: 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中的变量在工程开发中是非常常用的,大家需要好好掌握和理解。

以下是关于 Makefile 中变量的总结:

定义变量:

使用 = 或 := 运算符将值赋给变量。

通常将变量定义在 Makefile 的顶部,以便容易查找和修改。

引用变量:

使用 $( 和 ) 或 ${ 和 } 来引用变量的值。

例如,使用 $(VAR) 或 ${VAR} 引用变量 VAR。

预定义变量:

Makefile 提供了一些预定义的特殊变量,可以在构建过程中使用。

例如,@ 表示目标名, @ 表示目标名,@表示目标名,^ 表示所有依赖文件列表。

自动化变量:

Makefile 还提供了一些特殊的自动化变量,用于表示特定的构建相关信息。

例如,@ 表示当前目标文件名, @ 表示当前目标文件名,@表示当前目标文件名,< 表示第一个依赖文件名。

变量的扩展:

可以通过在变量名前添加 $ 或 {} 来对变量进行扩展。

例如,$(VAR_SUFFIX) 或 ${VAR}_SUFFIX 进行变量名的扩展。

变量的修改和操作:

可以对变量进行字符串操作,例如添加前缀或后缀,截取子串等。

使用内置的字符串操作函数,如 $(subst from,to,text)。

默认变量值:

可以为变量提供默认值,以便在未定义时使用。

使用符号 `?=`` 来定义默认值。

环境变量:

Makefile 可以使用系统环境变量,并将其赋值给 Makefile 中的变量。

使用 $(VAR) := $(ENV_VAR) 进行赋值。

通过合理利用变量,可以使得 Makefile 更具可维护性和灵活性。您可以根据不同的需求来定义、操作和引用变量,以便在构建过程中进行自定义配置和参数传递。


相关文章
|
Shell Linux C语言
Makefile基础教程(自动生成依赖关系)
Makefile基础教程(自动生成依赖关系)
382 0
Linux命令:`cp` - 复制文件与目录的利器
`cp`是Linux中的命令行工具,用于复制文件和目录。基本语法是`cp [选项] 源 目标`。常用选项包括:`-r`(递归复制目录)、`-i`(交互式确认覆盖)、`-u`(只复制更新的文件)、`-v`(详细输出)、`-p`(保留文件属性)、`-l`(创建硬链接)和`-s`(创建符号链接)。`--backup`选项可在覆盖前创建备份,`--sparse`处理稀疏文件。通过组合使用这些选项,用户可以灵活地管理文件和目录的复制操作。
|
Unix Shell Linux
linux互斥锁(pthread_mutex)知识点总结
linux互斥锁(pthread_mutex)知识点总结
|
存储 Linux 内存技术
深入理解bootargs
深入理解bootargs
949 0
|
Linux Docker 容器
Linux的namespace和cgroups简介
本文介绍了Linux的Namespace技术和cgroups,解释了它们如何帮助实现容器的隔离和资源限制。
361 7
Linux的namespace和cgroups简介
makefile 变量的替换,嵌套引用,命令行变量
makefile 变量的替换,嵌套引用,命令行变量
305 1
|
前端开发 测试技术 API
Apifox 深度评测:你应该使用的 API 管理工具
Apifox是一款强大的API管理工具,集API设计、开发、测试和文档管理于一体,有效解决传统工具分散导致的效率低下和信息不一致问题。它提供直观界面定义API接口,自动生成文档,支持数据模型管理及迭代分支功能。此外,Apifox具备Mock服务、强大的调试工具和自动化测试能力,还能进行性能测试评估API在高负载下的表现。其文档管理功能支持版本控制和变更历史追踪,便于团队协作与分享。Apifox的优势在于一体化解决方案和简洁直观的用户界面,相较于Postman和Swagger等竞品,在功能整合和易用性方面表现出色。总之,Apifox为API全生命周期管理提供了全面支持,极大提升了开发效率。
|
Ubuntu 安全 网络协议
|
Ubuntu Linux 开发工具
Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)
Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)
436 0
Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)
|
监控 Linux 定位技术
Linux应用开发基础知识——串口应用编程(十一)
Linux应用开发基础知识——串口应用编程(十一)
455 0
Linux应用开发基础知识——串口应用编程(十一)