那曲檬骨新材料有限公司

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

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

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

【Makefile】函數(shù)介紹

_light ? 來源:_light ? 作者:_light ? 2022-11-18 10:23 ? 次閱讀

函數(shù)格式及示例

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

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

$(函數(shù)名 參數(shù))
# 或者使用花括號
${函數(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,也就是說它會把輸入

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

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

wildcard 函數(shù)

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

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

例如函數(shù)調(diào)用 $(wildcard *.c),函數(shù)執(zhí)行后會把當(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ī)則來替換字符串,當(dāng)匹配規(guī)則中有 % 號時,

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

直接閱讀以下示例:

$(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ù)沒有輸出

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

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

build_dir/%.o% 號中,所以最終的輸出為 build_dir/hello_main.o 。

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

不上,所以不會進(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ù)雜,此時借助 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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62973
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19219
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    Makefile編寫

    Makefile編寫 Makefile編寫在很多時候有著很大的作用,那么我們該如何編寫呢,下面大家一起來了解一下關(guān)于Makefile編寫的內(nèi)容。1. make和Makefile
    發(fā)表于 11-02 15:59

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

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

    Makefile中文教程 -下載

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

    C語言入門教程-makefile

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

    駕馭Makefile

    駕馭Makefile在網(wǎng)上你能找到很多關(guān)于Makefile的學(xué)習(xí)資料,但絕大部分給你的只是一個知識點(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)核的,可以說關(guān)于2.6內(nèi)核Makefile相關(guān)的文章鳳毛麟角,筆者抽時間完成了這篇分析文章,讓讀者迅速熟悉Linux最新Makefile體系,從而加深對內(nèi)核的理解,同時也希望能
    發(fā)表于 11-02 10:12 ?1次下載

    linux makefile教程

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

    makefile的基本語法

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

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

    Makefile的重要性 會不會寫makefile,從一個側(cè)面說明了一個人是否具備完成大型工程的能力 makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件
    發(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可以從一個名為Makefile的文件中獲得如何構(gòu)建程序的知識,該文件列出了每個非源文件以及如何從其他文件計算它。當(dāng)你編寫一個程序時,你應(yīng)該為它編寫一個Makefile文件,這樣就可以使用Make來編譯和安裝這個程序。
    發(fā)表于 12-24 10:36 ?1900次閱讀

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

    Makefile】簡單實(shí)用的Makefile模板來了

    【Linux + Makefile】簡單實(shí)用的Makefile模板來了
    的頭像 發(fā)表于 08-31 12:46 ?1948次閱讀
    【<b class='flag-5'>Makefile</b>】簡單實(shí)用的<b class='flag-5'>Makefile</b>模板來了
    足球投注网站| 百家乐官网怎么计算概率| 线上龙虎| 澳门金沙官网| 百家乐真人游戏| 阿勒泰市| 太阳城娱乐城下载| 大发888为什么进不去| 威尼斯人娱乐欢迎您| 百家乐庄闲的概率| 谁会玩百家乐官网的玩法技巧和规则| 百家乐官网娱乐城新澳博| 百家乐官网一黑到底| 网上现金百家乐| 伟德百家乐官网下载| 永利博线上娱乐城| 百家乐官网打庄技巧| 百家乐官网足球投注网哪个平台网址测速最好 | 百家乐代理 | bet365体育在线投注 jxhymp| 永胜博娱乐| 清原| 金臂百家乐官网注册送彩金| 聚众玩百家乐官网的玩法技巧和规则| 中国百家乐官网软件| 太子娱乐城官网| 赌博百家乐官网有技巧吗| 百家乐官网网上赌局| 赌百家乐官网到底能赌博赢| 网上百家乐官网有假的吗| 单机百家乐官网小游戏| 庄闲和百家乐官网桌布| 百家乐的代理办法| 最可信百家乐娱乐城| 百家乐英皇赌场娱乐网规则| 德州扑克庄家| 百家乐官网博彩策略论坛| 百家乐官网扫描技术| 姚记百家乐官网的玩法技巧和规则| 百家乐出千工具价格| 玩百家乐上高尔夫娱乐场|