makefile(04)_函數(shù)

9.函數(shù)定義及調(diào)用

Makefile中支持函數(shù)的概念,make解析器提供了一系列函數(shù)供Makefile使用。同時(shí)可以自定義函數(shù)。

汪清ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

9.1.自定義函數(shù)

在Makefile中支持自定義函數(shù)的實(shí)現(xiàn),并調(diào)用執(zhí)行,通過define關(guān)鍵字來實(shí)現(xiàn)自定義函數(shù)。
函數(shù)定義的語法規(guī)則:
makefile(04)_函數(shù)
自定義函數(shù)的本質(zhì):
1.自定義函數(shù)其實(shí)是一個(gè)多行變量,無法直接調(diào)用;通過call 關(guān)鍵字來使用(call的作用就是將實(shí)參替換到函數(shù)體對(duì)應(yīng)的位置)
2.自定義函數(shù)是一種過程調(diào)用,沒有任何的返回值;
3.用于定義命令集合,并應(yīng)用于規(guī)則中。
示例:

.PHONY : test

define func1
    @echo "My name is $(0)"
endef

define func2
    @echo "My name is $(0)"
    @echo "Param 1 => $(1)"
    @echo "Param 2 => $(2)"
endef

var := $(call func1)
new := $(func1)

test :
    @echo "new => $(new)"
    @echo "var => $(var)"
    $(call func1)  #@echo My name is func1
    $(call func2, D.T.Software, delphi_tang)

輸出結(jié)果:
makefile(04)_函數(shù)

9.2.預(yù)定義函數(shù)

Make的函數(shù)提供了處理文件名,變量和命令的函數(shù),可以在需要的地方調(diào)用函數(shù)來處理指定的參數(shù),函數(shù)再調(diào)用的地方被替換為處理結(jié)果。
預(yù)定義函數(shù)的調(diào)用:
makefile(04)_函數(shù)
為什么自定義函數(shù)和預(yù)定義函數(shù)的調(diào)用形式完成不同?
本質(zhì)上,Makefile不支持真正意義上的自定義函數(shù),自定義函數(shù)本質(zhì)上是多行變量,預(yù)定義的call函數(shù)在調(diào)用時(shí)將參數(shù)傳遞給多行變量,自定義函數(shù)時(shí)call函數(shù)的參數(shù),并在call中被執(zhí)行。
示例:

.PHONY : test

define func1
    @echo "My name is $(0)"
endef

define func2
    @echo "My name is $(0)"
endef

var1 := $(call func1)
var2 := $(call func2)
var3 := $(abspath ./)
var4 := $(abspath test.cpp)

test :
    @echo "var1 => $(var1)"
    @echo "var2 => $(var2)"
    @echo "var3 => $(var3)"
    @echo "var4 => $(var4)"

輸出結(jié)果:
makefile(04)_函數(shù)

10.變量與函數(shù)的綜合運(yùn)用

10.1.實(shí)戰(zhàn)需求:

自動(dòng)生成target文件夾存放可執(zhí)行程序,生成objs文件夾存放編譯生成的目標(biāo)文件(*.o)
支持調(diào)試版本的編譯選擇(通過預(yù)編譯宏實(shí)現(xiàn)),考慮代碼的擴(kuò)展性(自定義變量)

10.2.工具原料:

$(wildcard _pattern),獲取當(dāng)前工作目錄中滿足_pattern的文件或者目錄
$(addprefix _prefix _name),給名字列表_name中的每一個(gè)名字增加前綴_prefix

10.3.關(guān)鍵技巧:

1.自動(dòng)獲取當(dāng)前目錄下的源文件列表(函數(shù)調(diào)用),SRCS := $(wildcard *.c)
2.根據(jù)文件列表生成目標(biāo)文件列表(變量指定替換)OBJS := $(SRCS:.c=.o)
3.對(duì)每一個(gè)目標(biāo)文件列表加上路徑前綴(函數(shù)調(diào)用)OBJS := $(addprefix path/, $(OBJS))
規(guī)則中的模式替換:
這兩種模式替換的區(qū)別在于,后者的模式替換目標(biāo)來自于一個(gè)變量var,前者的目標(biāo)來自一個(gè)指定的文件夾。
makefile(04)_函數(shù) makefile(04)_函數(shù)
編譯規(guī)則的依賴:
makefile(04)_函數(shù)
最終程序:

CC := gcc
MKDIR := mkdir
RM := rm -fr

DIR_OBJS := objs
DIR_TARGET := target

DIRS := $(DIR_OBJS) $(DIR_TARGET)

TARGET := $(DIR_TARGET)/hello-makefile.out
# main.c const.c func.c
SRCS := $(wildcard *.c)
# main.o const.o func.o
OBJS := $(SRCS:.c=.o)
# objs/main.o objs/const.o objs/func.o
OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))

.PHONY : rebuild clean all

$(TARGET) : $(DIRS) $(OBJS)
    $(CC) -o $@ $(OBJS)
    @echo "Target File ==> $@"

$(DIRS) :
    $(MKDIR) $@

# 針對(duì)當(dāng)前文件下的工作目錄進(jìn)行模式替換
$(DIR_OBJS)/%.o : %.c
    ifeq ($(DEBUG),true)
        $(CC) -o $@ -g -c $^ 
    else   
        $(CC) -o $@ -c $^
    endif

rebuild : clean all

all : $(TARGET)

clean :
    $(RM) $(DIRS)

源文件main.c

extern void foo();

int main()
{
        foo();

        return 0;
}

源文件const.c
const char* g_hello = "hello makefile";
源文件func.c

#include "stdio.h"

extern char* g_hello;

void foo()
{
        printf("void foo() : %s\n", g_hello);
}

輸出結(jié)果
makefile(04)_函數(shù)

新聞標(biāo)題:makefile(04)_函數(shù)
網(wǎng)站鏈接:http://bm7419.com/article0/ijpjoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google定制網(wǎng)站、做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司