makefile 变量深入剖析

一、makefile 变量概述

makefile 变量是一些被赋值的标识符(Identifier),它们用于储存各种用到的字符串或者数值。这些变量可以是自己定义的,也可以是系统默认的。在 makefile 中,变量是用于存放一些封装的命令或者路径信息等动态的信息。

默认情况下,make 命令会根据系统环境变量的不同而提供一些默认变量,我们也可以通过 makefile 进行自定义变量,从而实现模块化的编程思路。

二、变量的赋值和引用

makefile 变量的基本操作包括其赋值和引用。变量的赋值使用“=”符号,如下所示:

CC=gcc

这段代码为 CC 赋值为 gcc。

变量的引用则使用“$”符号,如下所示:

$(CC) -o test test.c

这段代码中,将通过变量 CC 来引用 gcc 编译器。

在 makefile 中,还可以通过“:=”符号进行变量的延迟赋值。如下所示:

OBJECTS :=
OBJECTS += main.o

这段代码中,OBJECTS 变量先被赋值为空,后来 += 符号是在不断地向 OBJECTS 变量中添加 main.o 目标文件。这样就可以通过变量 OBJECTS 直接引用所有目标文件了。

三、预定义变量

为了方便程序员编写 makefile,GNU make 已经提供了一些预定义变量,程序员可以直接引用这些变量。下面是一些 GNU make 的常用预定义变量:

  • $(CC):C 语言编译器
  • $(CFLAGS):C 语言编译器参数
  • $(CPP):C++ 语言编译器
  • $(CXXFLAGS):C++ 语言编译器参数
  • $(AR):C 语言库文件打包命令
  • $(ARFLAGS):C 语言库文件打包命令参数
  • $(LD):链接器
  • $(LDFLAGS):链接器参数

四、函数式变量

makefile 中还提供了很多系统内置的函数,通过这些函数可以实现很多高级的功能。比如 $(wildcard) 函数可以查找当前工作目录下的所有文件,$(patsubst) 函数可以将源文件路径和目标文件路径匹配。

函数式变量的语法形式如下:

$(function arguments)

其中,function 代表函数名,arguments 代表参数。下面是系统内置的一些函数:

  • $(strip string):去除字符串中的空格
  • $(subst old,new,text):将 text 字符串中的 old 字符串替换成 new 字符串
  • $(patsubst pattern,replacement,text):将 text 字符串中按照 pattern 模式匹配的内容替换成 replacement 字符串
  • $(wildcard pattern):查找当前工作目录下所有符合 pattern 模式的文件名
  • $(foreach var,list,text):将 list 中每个元素进行处理,并赋值给 var 变量,并将结果拼接起来
  • $(shell command):执行一个 shell 命令,并返回其结果

五、自定义变量

为了使 makefile 更加模块化,我们可以在 makefile 中自定义一些变量。

下面是一个例子,展示在 makefile 中如何自定义变量:

INC_DIR = include
LIB_DIR = lib
SRC_DIR = src
 
CFLAGS = -I$(INC_DIR)
 
all:$(LIB_DIR)/libfoo.a
 
$(LIB_DIR)/libfoo.a:$(SRC_DIR)/foo.c
    gcc -c $(SRC_DIR)/foo.c $(CFLAGS) -o $(LIB_DIR)/foo.o
    ar r $(LIB_DIR)/libfoo.a $(LIB_DIR)/foo.o

这段代码中,定义了三个自定义变量:INC_DIR,LIB_DIR 和 SRC_DIR,分别表示头文件目录,库文件目录和源代码目录。另外,CFLAGS 变量也被设置为了 -I$(INC_DIR),这样就可以使编译器能够找到 INC_DIR 目录中的头文件。

在 all 发展中,引用了 $(LIB_DIR)/libfoo.a 变量,并将其作为 all 的最终目标。

六、总结

本文对 makefile 变量进行了详细的剖析,包括了变量的赋值和引用,预定义变量,函数式变量和自定义变量等方面的内容。了解这些知识点,可以让我们更好地编写 makefile,提高编程效率。

原创文章,作者:NMFGG,如若转载,请注明出处:https://www.506064.com/n/331252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NMFGGNMFGG
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相关推荐

  • int类型变量的细节与注意事项

    本文将从 int 类型变量的定义、声明、初始化、范围、运算和类型转换等方面,对 int 类型变量进行详细阐述和讲解,帮助读者更好地掌握和应用 int 变量。 一、定义与声明 int…

    编程 2025-04-29
  • Python input参数变量用法介绍

    本文将从多个方面对Python input括号里参数变量进行阐述与详解,并提供相应的代码示例。 一、基本介绍 Python input()函数用于获取用户输入。当程序运行到inpu…

    编程 2025-04-29
  • Python匿名变量的使用方法

    Python中的匿名变量是指使用“_”来代替变量名的特殊变量。这篇文章将从多个方面介绍匿名变量的使用方法。 一、作为占位符 匿名变量通常用作占位符,用于代替一个不需要使用的变量。例…

    编程 2025-04-29
  • Python变量在内存中的存储

    该文章将从多个方面对Python变量在内存中的存储进行详细阐述,包括变量的声明和赋值、变量的引用和指向、内存地址的变化、内存管理机制等。 一、声明和赋值 在Python中,变量声明…

    编程 2025-04-29
  • Python变量类型用法介绍

    Python是一种解释型编程语言,它提供了丰富的数据类型,包括数字、字符串、列表、元组、集合、字典等。Python变量类型的定义是Python程序开发的基础,本文将从以下几个方面对…

    编程 2025-04-28
  • Python print输出变量

    Python是一种脚本语言,语法简单易懂,目前被广泛应用于数据处理、人工智能、web开发、游戏开发等领域。其中print函数是Python中最常用的函数之一,用于将变量输出到控制台…

    编程 2025-04-28
  • Python定义变量

    Python是一门高级编程语言,变量是Python编程中非常重要的一个概念。Python的变量定义方式非常简单,可以在程序中随时定义一个变量来存储数据,这方便了整个程序的逻辑编写,…

    编程 2025-04-28
  • Python中如何定义一个变量

    Python是一种高级编程语言,使用它您可以轻松地定义和操作变量。Python中的变量属于动态类型变量,因此不需要在定义变量时指定其类型,而是在变量分配之前自动确定变量的数据类型。…

    编程 2025-04-28
  • Python每次运行变量加一:实现计数器功能

    Python编程语言中,每次执行程序都需要定义变量,而在实际开发中常常需要对变量进行计数或者累加操作,这时就需要了解如何在Python中实现计数器功能。本文将从以下几个方面详细讲解…

    编程 2025-04-28
  • Python中局部变量通常出现在函数中

    在Python编程中,局部变量是在函数中定义的变量,只能在函数内部访问。相比于全局变量,局部变量的作用域更加有限,但是它们可以提高代码的模块化,并减少变量名的混淆。 一、局部变量的…

    编程 2025-04-28

发表回复

登录后才能评论