91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

路徑搜索的綜合示例(十三)

發布時間:2020-07-01 21:58:50 來源:網絡 閱讀:443 作者:上帝之子521 欄目:系統運維

        我們在前面學習了 makefile 中的路徑搜索,那么我們今天就來實戰演練下。需求分析:1、工程中不需要源碼文件夾在編譯時被改動(只讀文件夾);2、在編譯時自動創建文件夾(build)用于存放編譯結果;3、編譯過程中能夠自動搜索需要的文件;3、編譯過程中能夠自動搜索需要的文件;4、makefile 易于擴展,能夠復用于相同類型的項目;5、支持調試版本的編譯選項。

        我們來看看這種項目的類型,如下

路徑搜索的綜合示例(十三)

        那么我們需要的工具原料有:a> $(wildcard $(DIR)/_pattern),用來獲取 $(DIR) 文件夾中滿足 _pattern 的文件;b> $(notdir _names),用于去除 _names 中每一個文件名的路徑前綴;c> $(patsubst _pattern, replacement, _text),用于將 _text 中符合 _pattern 的部分替換為 replacement。這里面的關鍵技巧有:1、自動獲取源文件列表(函數調用): SRCS := $(wildcard src/*.c);2、根據源文件列表生成目標文件列表(變量的值替換): OBJS := $(SRCS:.c=.o);3、替換每一個目標文件的路徑前綴(函數調用): OBJS := $(patsubst src/%, build/%, $(OBJS))。下來我們來看看編譯規則的依賴,如下圖所示

路徑搜索的綜合示例(十三)

        下來我們來看看 makefile 怎么寫,src 和 inc 文件夾還是之前的

.PHONY : all clean rebuild

DIR_BUILD := build
DIR_SRC := src
DIR_INC := inc

TYPE_INC := .h
TYPE_SRC := .c
TYPE_OBJ := .o

CC := gcc
CFLAGS := -I $(DIR_INC)
ifeq ($(DEBUG), true)
CFLAGS += -g
endif

MKDIR := mkdir
RM := rm -rf

APP := $(DIR_BUILD)/app.out
HDRS := $(wildcard $(DIR_INC)/*$(TYPE_INC))
HDRS := $(notdir $(HDRS))
OBJS := $(wildcard $(DIR_SRC)/*$(TYPE_SRC))
OBJS := $(OBJS:$(TYPE_SRC)=$(TYPE_OBJ))
OBJS := $(patsubst $(DIR_SRC)/%, $(DIR_BUILD)/%, $(OBJS))

vpath %$(TYPE_INC) $(DIR_INC)
vpath %$(TYPE_SRC) $(DIR_SRC)

all : $(DIR_BUILD) $(APP)
    @echo "Target File ==> $(APP)"

$(DIR_BUILD) :
    $(MKDIR) $@

$(APP) : $(OBJS)
    $(CC) -o $@ $^

$(DIR_BUILD)/%$(TYPE_OBJ) : %$(TYPE_SRC) $(HDRS)
    $(CC) $(CFLAGS) -o $@ -c $<

clean :
    $(RM) $(DIR_BUILD)

rebuild :
    $(MAKE) clean
    $(MAKE) all

        我們看到變量 HDRS 是先進入到 inc 文件夾下獲取到所需的 .h 頭文件,然后再經過 notdir 去除掉它的路徑名。我們利用 TYPE_XXX 來定義相應的 頭文件(或源文件或目標文件),這樣做是為了讓這個 makefile 具有更好的移植性。利用 vpath 來指定相應的路徑。通過 DEBUG 宏判斷它是否為調試版本。下來我們先來看看它是否能正常工作。

路徑搜索的綜合示例(十三)

        我們看到它已經正確工作了,并且在 build 文件夾下生產相應的 app.out 以及 .o 文件,原 inc 和 src 文件夾并沒有被污染。這便達到了我們的要求了,如果是換一個類似的項目(包含有 .h 的頭文件庫和 .c 的源文件庫),我們也能直接拿去這個 makefile 進行使用;如果是 C++ 項目,那么我們換個 g++ 編譯器就可以正常工作。但是有個小問題,就是如果其中有一個頭文件改動,整個項目就必須全部編譯。我們就得思考了:對于規則較小的項目,我們在 makefile 中是否也需要使用自動生成依賴關系的解決方案呢?如果使用自動生成依賴關系的解決方案,那么整個的 makefile 代碼的編寫就相當復雜了。我們究竟該如何做呢?如果對于較小的項目,我們就不必使用自動生成依賴關系,因為此時不但是 makefile 的編寫比較復雜,而且不利用后期的維護。

        通過對路徑搜索的綜合開發的學習,總結如下:1、工程項目中不希望源碼文件夾在編譯時被改動,模式規則的靈活運用使得 makefile 具有復用性;2、變量的靈活運用使得 makefile 具有擴展性;3、規模較小的項目沒必要使用自動生成依賴關系的解決方案;4、規則較小的項目可以直接讓源文件依賴于頭文件(原因就是易于維護)。


        歡迎大家一起來學習 makefile 語言,可以加我QQ:243343083

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安阳县| 遂宁市| 上犹县| 清丰县| 延长县| 博白县| 论坛| 龙陵县| 交口县| 中阳县| 阜阳市| 瓮安县| 佳木斯市| 长葛市| 句容市| 东安县| 涡阳县| 齐齐哈尔市| 辉县市| 北票市| 张掖市| 万年县| 宁城县| 白银市| 甘孜| 当阳市| 松潘县| 顺昌县| 沙田区| 文安县| 吉木萨尔县| 尚义县| 涡阳县| 娱乐| 繁昌县| 泰安市| 麻城市| 灌云县| 金门县| 定远县| 永靖县|