<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 簡介 makefile就像個shell命令一樣.也可以執行一些命令 一般來說,大多數的IDE都有這個命令, 比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。 可見,makefile都成為了一種在工程方面的編譯方法。 ~~~ sudo apt install make -y ~~~ # 語法規則 **一條規則:** > 目標:依賴文件列表 > > 命令列表 Makefile基本規則三要素: 1)目標: * 通常是要產生的文件名稱,目標可以是可執行文件或其它obj文件,也可是一個動作的名稱 2)依賴文件: * 用來輸入從而產生目標的文件 * 一個目標通常有幾個依賴文件(可以沒有) 3)命令: * make執行的動作,一個規則可以含幾個命令(可以沒有) * 有多個命令時,每個命令占一行 ~~~ all:test1 test2 echo "hello all" test1: echo "hello test1" test2: echo "hello test2" ~~~ ~~~ make -f Makefile ~~~ # 命令格式 make是一個命令工具,它解釋Makefile 中的指令(應該說是規則)。 make命令格式: make \[ -f file \]\[ options \]\[ targets \] 1.\[ -f file \]: * make默認在工作目錄中尋找名為GNUmakefile、makefile、Makefile的文件作為makefile輸入文件 * \-f 可以指定以上名字以外的文件作為makefile輸入文件 2.\[ options \] * \-v: 顯示make工具的版本信息 * \-w: 在處理makefile之前和之后顯示工作路徑 * \-C dir:讀取makefile之前改變工作路徑至dir目錄 * \-n:只打印要執行的命令但不執行 * \-s:執行但不顯示執行的命令 3.\[ targets \]: * 若使用make命令時沒有指定目標,則make工具默認會實現makefile文件內的第一個目標,然后退出 * 指定了make工具要實現的目標,目標可以是一個或多個(多個目標間用空格隔開)。 # 工作原理 1. 若想生成目標, 檢查規則中的依賴條件是否存在,如不存在,則尋找是否有規則用來 生成該依賴文件 ![](https://img.kancloud.cn/b7/67/b76700899133c2eb3481546c41440cff_588x232.png) 2. 檢查規則中的目標是否需要更新,必須先檢查它的所有依賴,依賴中有任一個被更新,則目標必須更新 ![](https://img.kancloud.cn/a0/1b/a01b3ed16c141750c1ea6d026d135c1d_541x275.png) **總結:** * 分析各個目標和依賴之間的關系 * 根據依賴關系自底向上執行命令 * 根據修改時間比目標新,確定更新 * 如果目標不依賴任何條件,則執行對應命令,以示更新 # 例子 測試程序: `test.c add.c sub.c mul.c div.c` **最簡單的Makefile** ~~~ test:test.c add.c sub.c mul.c div.c gcc test.c add.c sub.c mul.c div.c -o test ~~~ 缺點:效率低,修改一個文件,所有文件會被全部編譯 **第二個版本Makefile** ~~~ test:test.o add.o sub.o mul.o div.o gcc test.o add.o sub.o mul.o div.o -o test ? test.o:test.c gcc -c test.c add.o:add.c gcc -c add.c sub.o:sub.c gcc -c sub.c mul.o:mul.c gcc -c mul.c div.o:div.c gcc -c div.c ~~~ # Makefile中的變量 在Makefile中使用變量有點類似于C語言中的宏定義,使用該變量相當于內容替換,使用變量可以使Makefile易于維護,修改內容變得簡單變量定義及使用。 **自定義變量** 1. 定義變量方法: 變量名=變量值 2. 引用變量: ~~~ $(變量名)或${變量名} ~~~ 3. makefile的變量名: * makefile變量名可以以數字開頭 * 變量是大小寫敏感的 * 變量一般都在makefile的頭部定義 * 變量幾乎可在makefile的任何地方使用 ~~~ # 變量 OBJS=add.o sub.o mul.o div.o test.o TARGET=test ${TARGET}:${OBJS} gcc test.o add.o sub.o mul.o div.o -o test test.o:test.c gcc -c test.c -o test.o add.o:add.c gcc -c add.c -o add.o sub.o:sub.c gcc -c sub.c -o sub.o mul.o:mul.c gcc -c mul.c -o mul.o div.o:div.c gcc -c div.c -o div.o clean: rm -rf ${OBJS} ${TARGET} ~~~ 除了使用用戶自定義變量,makefile中也提供了一些變量(變量名大寫)供用戶直接使用,我們可以直接對其進行賦值。 > CC = gcc#arm-linux-gcc > > CPPFLAGS :C預處理的選項 如:-I > > CFLAGS: C編譯器的選項 -Wall -g -c > > LDFLAGS : 鏈接器選項 -L -l # 自動變量 * `$@`: 表示規則中的目標 * `$<`: 表示規則中的第一個條件 * `$^`: 表示規則中的所有條件, 組成一個列表, 以空格隔開,如果這個列表中有重復的項則消除重復項。 **注意:自動變量只能在規則的命令中中使用** ~~~ # 變量 OBJS=add.o sub.o mul.o div.o test.o TARGET=test CC=gcc ${TARGET}:${OBJS} gcc test.o add.o sub.o mul.o div.o -o test test.o:test.c ${CC} -c $^ -o $@ add.o:add.c ${CC} -c $^ -o $@ sub.o:sub.c ${CC} -c $^ -o $@ mul.o:mul.c ${CC} -c $^ -o $@ div.o:div.c ${CC} -c $^ -o $@ clean: rm -rf ${OBJS} ${TARGET} ~~~ # 模式規則 把一些相同的變量替換 模式規則示例: > %.o:%.c > > $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ ~~~ # 變量 OBJS=add.o sub.o mul.o div.o test.o TARGET=test CC=gcc ${TARGET}:${OBJS} gcc test.o add.o sub.o mul.o div.o -o test %.o:%.c ${CC} -c $^ -o $@ clean: rm -rf ${OBJS} ${TARGET} ~~~ # Makefile中的函數 makefile中的函數有很多,在這里給大家介紹兩個最常用的。 > 1. wildcard – 查找指定目錄下的指定類型的文件 > > src = $(wildcard *.c) //找到當前目錄下所有后綴為.c的文件,賦值給src > > 2. patsubst – 匹配替換 > > obj = $(patsubst %.c,%.o, $(src)) //把src變量里所有后綴為.c的文件替換成.o 在makefile中所有的函數都是有返回值的。 ~~~ # 獲取當前目錄下的所有.c文件 SRC=${wildcard *.c} # 將SRC中所有出現的.c替換成.o OBJS=${patsubst %.c, %.o, ${SRC}} TARGET=test CC=gcc ${TARGET}:${OBJS} gcc ${OBJS} -o ${TARGET} %.o:%.c ${CC} -c $^ -o $@ ~~~ # Makefile中的偽目標 clean用途: 清除編譯生成的中間.o文件和最終目標文件 make clean 如果當前目錄下有同名clean文件,則不執行clean對應的命令 解決方案: ?偽目標聲明: **.PHONY:clean** 聲明目標為偽目標之后,makefile將不會該判斷目標是否存在或者該目標是否需要更新 **clean命令中的特殊符號:** * “-”此條命令出錯,make也會繼續執行后續的命令。如:“-rm main.o” * “@”不顯示命令本身,只顯示結果。如:“@echo clean done” ~~~ SRC=${wildcard *.c} OBJS=${patsubst %.c, %.o, ${SRC}} TARGET=test CC=gcc ${TARGET}:${OBJS} gcc ${OBJS} -o ${TARGET} %.o:%.c @${CC} -c $^ -o $@ #聲明clean為偽目標,偽目標不去判斷文件是否存在或者已經更新 #無條件執行命令 .PHONY:clean clean: -rm -rf ${OBJS} ~~~ 執行 ~~~ make -f Makefile clean ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看