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/zh-tw/n/330977.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NMFGG的頭像NMFGG
上一篇 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

發表回復

登錄後才能評論