函數(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)
- 編譯
make
- 運(yùn)行
make run
- 刪除文件
make clean
審核編輯:湯梓紅
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4332瀏覽量
62666 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19189
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論