0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【Makefile】函數(shù)介紹

_light ? 來(lái)源:_light ? 作者:_light ? 2022-11-18 10:23 ? 次閱讀

函數(shù)格式及示例

在 Makefile 中調(diào)用函數(shù)的方法跟變量的使用類似,以“()”或“{}”符號(hào)包含函數(shù)

名和參數(shù),具體語(yǔ)法如下:

$(函數(shù)名 參數(shù))
# 或者使用花括號(hào)
${函數(shù)名 參數(shù)}

下面以常用的 notdir、 patsubst、 wildcard 函數(shù)為例進(jìn)行講解,并且示例中都是我們后面 Makefile 中使用到的內(nèi)容.

notdir 函數(shù)

notdir 函數(shù)用于去除文件路徑中的目錄部分。它的格式如下:

$(notdir 文件名)

例如輸入?yún)?shù) ./sources/func.c,函數(shù)執(zhí)行后的輸出為 func.c,也就是說(shuō)它會(huì)把輸入

中的 ./sources/ 路徑部分去掉,保留文件名。使用范例如下:

# 把路徑中的“./sources/”部分去掉,輸出為: hello_func.c
$(notdir ./sources/hello_func.c)

wildcard 函數(shù)

wildcard 函數(shù)用于獲取文件列表,并使用空格分隔開(kāi)。它的格式如下:

$(wildcard 匹配規(guī)則)

例如函數(shù)調(diào)用 $(wildcard *.c),函數(shù)執(zhí)行后會(huì)把當(dāng)前目錄的所有 .c 文件列出。假設(shè)在 sources目錄下有 func.c、main.c ,使用范例如下:

$(wildcard sources/*.c)
  # 函數(shù)的輸出為:
 sources/func.c sources/main.c

patsubst 函數(shù)

patsubst 函數(shù)功能為模式字符串替換。它的格式如下:

$(patsubst 匹配規(guī)則, 替換規(guī)則, 輸入的字符串)

當(dāng)輸入的字符串符合匹配規(guī)則,那么使用替換規(guī)則來(lái)替換字符串,當(dāng)匹配規(guī)則中有 % 號(hào)時(shí),

替換規(guī)則也可以例程 % 號(hào)來(lái)提取 % 匹配的內(nèi)容加入到最后替換的字符串中。有點(diǎn)抽象,請(qǐng)

直接閱讀以下示例:

$(patsubst %.c, build_dir/%.o, hello_main.c )
 # 函數(shù)的輸出為:
 build_dir/hello_main.o
 # 執(zhí)行如下函數(shù)
 $(patsubst %.c, build_dir/%.o, hello_main.xxx )
 # 由于 hello_main.xxx 不符合匹配規(guī)則"%.c",所以函數(shù)沒(méi)有輸出

第一個(gè)函數(shù)調(diào)用中,由于 hello_main.c 符合 %.c 的匹配規(guī)則( **% 在 Makefile 中的類似于 * 通

配符** ),而且 %hello_main.c 中提取出了 hello_main 字符,把這部分內(nèi)容放到替換規(guī)

build_dir/%.o% 號(hào)中,所以最終的輸出為 build_dir/hello_main.o

第二個(gè)函數(shù)調(diào)用中,由于由于 hello_main.xxx 不符合 %.c 的匹配規(guī)則,.xxx.c 對(duì)

不上,所以不會(huì)進(jìn)行替換,函數(shù)直接返回空的內(nèi)容。

示例

假如我們有以下目錄結(jié)構(gòu):

.
├── includes
│   ├── add_one.h
│   └── func.h
├── makefile
└── sources
    ├── add_one.c
    ├── func.c
    └── main.c

文件內(nèi)容如下:

add_one.h

int add_one(int x, int y);

func.h

void func(void);

add_one.c

int add_one(int x, int y)
{
    return x + y;
}

func.c

#include "stdio.h"

void func(void)
{
    printf("This is %s file !", __FILE__);
}

main.c

#include "stdio.h"
#include "add_one.h"
#include "func.h"

int main()
{
    int x = 9, y = 8;
    int sum = 0;

    sum = add_one(x, y);

    printf("%d + %d = %d\\n", x, y, sum);
    func();

    return 0;
}

如果我們不借助makefile的話,直接運(yùn)行指令:

gcc -o main.exe .\\sources\\main.c .\\sources\\func.c .\\sources\\add_one.c -I .\\includes\\

即可完成編譯

以后我們的源文件 .c 增多,目錄結(jié)構(gòu)更復(fù)雜,此時(shí)借助 makefile 是最方便的

使用makefile

# 生成的可執(zhí)行文件名
TARGET = main.exe
# 編譯器
CC = gcc

#存放中間文件的路徑
BUILD_DIR = build
#存放源文件的文件夾
SRC_DIR = sources
#存放頭文件的文件夾
INC_DIR = includes 

# 源文件
SRCS = $(wildcard $(SRC_DIR)/*.c)  #列出 sources 目錄下的文件
# 目標(biāo)文件(*.o)
OBJS = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRCS)))
# 頭文件
DEPS = $(wildcard $(INC_DIR)/*.h)

# #################
# 編譯選項(xiàng)
# #################
# 指定頭文件的路徑
CFLAGS = $(patsubst %, -I%, $(INC_DIR))
# 輸出編譯警告
COPTION = -Wall   

# 生成目標(biāo)文件
$(BUILD_DIR)/$(TARGET): $(OBJS)
	$(CC) -o $@ $^ $(CFLAGS) $(COPTION)

#*.o 文件的生成規(guī)則
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS)
	@mkdir -p $(BUILD_DIR)
	$(CC) -o $@ -c $< $(CFLAGS) $(COPTION)

# 運(yùn)行.exe
run:
	@$(BUILD_DIR)/$(TARGET)

# 刪除生成的文件
clean:
	rm -rf $(BUILD_DIR)
  1. 編譯
make
  1. 運(yùn)行
make run
  1. 刪除文件
make clean

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4332

    瀏覽量

    62666
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19189
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于Makefile自動(dòng)生成-autotools的使用

    Makefile并非日常任務(wù),但遇見(jiàn)需要構(gòu)建大型軟件項(xiàng)目時(shí),利用工具自動(dòng)生成Makefile就顯得尤為關(guān)鍵。接下來(lái),我們將重點(diǎn)介紹一款自動(dòng)化構(gòu)建工具——Autoto
    的頭像 發(fā)表于 07-25 15:50 ?1511次閱讀
    關(guān)于<b class='flag-5'>Makefile</b>自動(dòng)生成-autotools的使用

    Makefile函數(shù)和實(shí)例分析

    首發(fā)平臺(tái):微信公眾號(hào)baiwenkejiARM裸機(jī)1期加強(qiáng)版視頻課程配套WiKi第9課第7節(jié)Makefile函數(shù)和第8節(jié)Makefile實(shí)例。發(fā)現(xiàn)沒(méi)有?wiki.100ask.org 也有變化:多了
    發(fā)表于 04-25 11:03

    Makefile編寫(xiě)

    Makefile編寫(xiě) Makefile編寫(xiě)在很多時(shí)候有著很大的作用,那么我們?cè)撊绾尉帉?xiě)呢,下面大家一起來(lái)了解一下關(guān)于Makefile編寫(xiě)的內(nèi)容。1. make和Makefile
    發(fā)表于 11-02 15:59

    Makefile中怎么使用函數(shù)來(lái)處理變量?

    Makefile中怎么使用函數(shù)來(lái)處理變量?make具有什么參數(shù)?使用make有什么注意事項(xiàng)?
    發(fā)表于 04-28 07:04

    Makefile中文教程 -下載

    Makefile中文教程,免費(fèi)下載哦。
    發(fā)表于 03-25 08:57 ?67次下載

    C語(yǔ)言入門(mén)教程-makefile

    makefile 重復(fù)鍵入上一節(jié)的gcc命令很是麻煩,尤其是當(dāng)您要不斷修改的代碼,且使用了好幾個(gè)函數(shù)庫(kù)的時(shí)候。make工具解決了這個(gè)問(wèn)題。您可以用下面的makefile代替前面的一串編
    發(fā)表于 07-29 11:20 ?902次閱讀

    駕馭Makefile

    駕馭Makefile在網(wǎng)上你能找到很多關(guān)于Makefile的學(xué)習(xí)資料,但絕大部分給你的只是一個(gè)知識(shí)點(diǎn),與將Makefile運(yùn)用到項(xiàng)目中(尤其是大型項(xiàng)目)的差距非常的大。因?yàn)?,?b class='flag-5'>Makefile
    發(fā)表于 01-05 17:05 ?9次下載

    關(guān)于Linux 2.6內(nèi)核Makefile的分析

    介紹文章都是基于2.4內(nèi)核的,可以說(shuō)關(guān)于2.6內(nèi)核Makefile相關(guān)的文章鳳毛麟角,筆者抽時(shí)間完成了這篇分析文章,讓讀者迅速熟悉Linux最新Makefile體系,從而加深對(duì)內(nèi)核的理解,同時(shí)也希望能
    發(fā)表于 11-02 10:12 ?1次下載

    linux makefile教程

     什么是makefile?或許很多Winodws的程序員都不知道這個(gè)東西,因?yàn)槟切¦indows的IDE都為你做了這個(gè)工作,但我覺(jué)得要作一個(gè)好的和professional的程序員,makefile
    發(fā)表于 11-12 09:11 ?5331次閱讀

    makefile的基本語(yǔ)法

     在Makefile中,最重要的三個(gè)概念是:目標(biāo)(target)、依賴關(guān)系(dependency)和命令(command)。目標(biāo)是指要干什么,即運(yùn)行make后生成什么;依賴是指明目標(biāo)所依賴的其他目標(biāo);命令則告訴make如何生成目標(biāo),這三個(gè)概念是通過(guò)Makefile中的規(guī)則
    發(fā)表于 11-12 10:15 ?1.1w次閱讀

    Makefile是什么?Makefile工作原理是怎樣的?Makefile經(jīng)典教程免費(fèi)下載

    Makefile的重要性 會(huì)不會(huì)寫(xiě)makefile,從一個(gè)側(cè)面說(shuō)明了一個(gè)人是否具備完成大型工程的能力 makefile帶來(lái)的好處就是——“自動(dòng)化編譯”,一旦寫(xiě)好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件
    發(fā)表于 09-12 17:19 ?0次下載
    <b class='flag-5'>Makefile</b>是什么?<b class='flag-5'>Makefile</b>工作原理是怎樣的?<b class='flag-5'>Makefile</b>經(jīng)典教程免費(fèi)下載

    Linux關(guān)于Makefile的用法介紹

    Make可以從一個(gè)名為Makefile的文件中獲得如何構(gòu)建程序的知識(shí),該文件列出了每個(gè)非源文件以及如何從其他文件計(jì)算它。當(dāng)你編寫(xiě)一個(gè)程序時(shí),你應(yīng)該為它編寫(xiě)一個(gè)Makefile文件,這樣就可以使用Make來(lái)編譯和安裝這個(gè)程序。
    發(fā)表于 12-24 10:36 ?1891次閱讀

    Makefile的項(xiàng)目模板免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Makefile的項(xiàng)目模板免費(fèi)下載 可根據(jù)項(xiàng)目名稱修改。
    發(fā)表于 06-12 08:00 ?11次下載
    <b class='flag-5'>Makefile</b>的項(xiàng)目模板免費(fèi)下載

    嵌入式中的Makefile應(yīng)用

    文章目錄一.Makefile 引入二. Makefile語(yǔ)法1.通配符2.假象目標(biāo)3.變量三.Makefile函數(shù)四.實(shí)例本文主要總結(jié)一下嵌入式開(kāi)發(fā)中的
    發(fā)表于 11-03 17:06 ?11次下載
    嵌入式中的<b class='flag-5'>Makefile</b>應(yīng)用

    Makefile】簡(jiǎn)單實(shí)用的Makefile模板來(lái)了

    【Linux + Makefile】簡(jiǎn)單實(shí)用的Makefile模板來(lái)了
    的頭像 發(fā)表于 08-31 12:46 ?1911次閱讀
    【<b class='flag-5'>Makefile</b>】簡(jiǎn)單實(shí)用的<b class='flag-5'>Makefile</b>模板來(lái)了