精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【Makefile】函數介紹

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

函數格式及示例

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

名和參數,具體語法如下:

$(函數名 參數)
# 或者使用花括號
${函數名 參數}

下面以常用的 notdir、 patsubst、 wildcard 函數為例進行講解,并且示例中都是我們后面 Makefile 中使用到的內容.

notdir 函數

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

$(notdir 文件名)

例如輸入參數 ./sources/func.c,函數執行后的輸出為 func.c,也就是說它會把輸入

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

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

wildcard 函數

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

$(wildcard 匹配規則)

例如函數調用 $(wildcard *.c),函數執行后會把當前目錄的所有 .c 文件列出。假設在 sources目錄下有 func.c、main.c ,使用范例如下:

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

patsubst 函數

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

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

當輸入的字符串符合匹配規則,那么使用替換規則來替換字符串,當匹配規則中有 % 號時,

替換規則也可以例程 % 號來提取 % 匹配的內容加入到最后替換的字符串中。有點抽象,請

直接閱讀以下示例:

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

第一個函數調用中,由于 hello_main.c 符合 %.c 的匹配規則( **% 在 Makefile 中的類似于 * 通

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

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

第二個函數調用中,由于由于 hello_main.xxx 不符合 %.c 的匹配規則,.xxx.c

不上,所以不會進行替換,函數直接返回空的內容。

示例

假如我們有以下目錄結構:

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

文件內容如下:

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的話,直接運行指令:

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

即可完成編譯

以后我們的源文件 .c 增多,目錄結構更復雜,此時借助 makefile 是最方便的

使用makefile

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

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

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

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

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

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

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

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4307

    瀏覽量

    62432
  • Makefile
    +關注

    關注

    1

    文章

    125

    瀏覽量

    19163
收藏 人收藏

    評論

    相關推薦

    關于Makefile自動生成-autotools的使用

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

    Makefile函數和實例分析

    首發平臺:微信公眾號baiwenkejiARM裸機1期加強版視頻課程配套WiKi第9課第7節Makefile函數和第8節Makefile實例。發現沒有?wiki.100ask.org 也有變化:多了
    發表于 04-25 11:03

    Makefile編寫

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

    Makefile中怎么使用函數來處理變量?

    Makefile中怎么使用函數來處理變量?make具有什么參數?使用make有什么注意事項?
    發表于 04-28 07:04

    Makefile中文教程 -下載

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

    C語言入門教程-makefile

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

    駕馭Makefile

    駕馭Makefile在網上你能找到很多關于Makefile的學習資料,但絕大部分給你的只是一個知識點,與將Makefile運用到項目中(尤其是大型項目)的差距非常的大。因為,將Makefile
    發表于 01-05 17:05 ?9次下載

    關于Linux 2.6內核Makefile的分析

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

    linux makefile教程

     什么是makefile?或許很多Winodws的程序員都不知道這個東西,因為那些Windows的IDE都為你做了這個工作,但我覺得要作一個好的和professional的程序員,makefile
    發表于 11-12 09:11 ?5296次閱讀

    makefile的基本語法

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

    Makefile是什么?Makefile工作原理是怎樣的?Makefile經典教程免費下載

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

    Linux關于Makefile的用法介紹

    Make可以從一個名為Makefile的文件中獲得如何構建程序的知識,該文件列出了每個非源文件以及如何從其他文件計算它。當你編寫一個程序時,你應該為它編寫一個Makefile文件,這樣就可以使用Make來編譯和安裝這個程序。
    發表于 12-24 10:36 ?1881次閱讀

    Makefile的項目模板免費下載

    本文檔的主要內容詳細介紹的是Makefile的項目模板免費下載 可根據項目名稱修改。
    發表于 06-12 08:00 ?11次下載
    <b class='flag-5'>Makefile</b>的項目模板免費下載

    嵌入式中的Makefile應用

    文章目錄一.Makefile 引入二. Makefile語法1.通配符2.假象目標3.變量三.Makefile函數四.實例本文主要總結一下嵌入式開發中的
    發表于 11-03 17:06 ?11次下載
    嵌入式中的<b class='flag-5'>Makefile</b>應用

    Makefile】簡單實用的Makefile模板來了

    【Linux + Makefile】簡單實用的Makefile模板來了
    的頭像 發表于 08-31 12:46 ?1875次閱讀
    【<b class='flag-5'>Makefile</b>】簡單實用的<b class='flag-5'>Makefile</b>模板來了