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 更具可维护性和灵活性。您可以根据不同的需求来定义、操作和引用变量,以便在构建过程中进行自定义配置和参数传递。


相关文章
|
3月前
|
存储 缓存 算法
【CMake 基础教程 】深入理解CMake变量:类型、原理及最佳实践
【CMake 基础教程 】深入理解CMake变量:类型、原理及最佳实践
137 0
|
3月前
|
Shell Linux C++
Makefile编译实战
Makefile编译实战
70 0
|
10月前
|
开发者
Makefile基础教程(伪目标)
Makefile基础教程(伪目标)
68 0
|
3月前
|
存储 编译器 Shell
Makefile语法基础
Makefile语法基础
19 0
|
9月前
|
Shell
如何使用makefile
如何使用makefile
|
10月前
|
存储 Shell vr&ar
Makefile基础教程(函数的使用)
Makefile基础教程(函数的使用)
77 0
|
10月前
|
编译器
Makefile基础教程(路径搜索)
Makefile基础教程(路径搜索)
115 0
|
10月前
Makefile基础教程(make的隐式规则)
Makefile基础教程(make的隐式规则)
78 0
CMake教程2:CMake语法-变量、流程控制、函数
CMake教程2:CMake语法-变量、流程控制、函数
118 0
|
Python
Python零基础学习笔记(二十六)—— 变量的作用域
作用域:变量可以使用的范围 程序的变量并不是所有位置都能使用的,访问的权限决定于变量在哪里赋值的 作用域:局部作用域全局作用域内建作用域
1104 0