9.8Makefile實例

視頻教程???
前面講了那么多Makefile的知識,現在開始做一個實例。
之前編譯的程序002_syntax,有個缺陷,將其復制出來,新建一個003_example文件夾,放在里面。 在c.c里面,包含一個頭文件c.h,在c.h里面定義一個宏,把這個宏打印出來。
c.c:?

c.h:
#define C 1
然后上傳編譯,執(zhí)行./test,打印出:
This is B?
This is C =1
測試沒有問題,然后修改c.h:
#define C 2
重新編譯,發(fā)現沒有更新程序,運行,結果不變,說明現在的Makefile存在問題。
為什么會出現這個問題呢, 首先我們test依賴c.o,c.o依賴c.c,如果我們更新c.c,會重新更新整個程序。 但c.o也依賴c.h,我們更新了c.h,并沒有在Makefile上體現出來,導致c.h的更新,Makefile無法檢測到。 因此需要添加:
c.o : c.c c.h
現在每次修改c.h,Makefile都能識別到更新操作,從而更新最后輸出文件。?

修改Makefile如下:

首先用obj變量將.o文件放在一塊。 利用前面講到的函數,把obj里所有文件都變?yōu)?%.d格式,并用變量dep_files表示。 利用前面介紹的wildcard函數,判斷dep_files是否存在。 然后是目標文件test依賴所有的.o文件。 如果dep_files變量不為空,就將其包含進來。 然后就是所有的.o文件都依賴.c文件,且通過-MD -MF生成.d依賴文件。 清理所有的.o文件和目標文件 清理依賴.d文件。
現在我門修改了任何.h文件,最終都會影響最后生成的文件,也沒任何手工添加.h、.c、.o文件,完成了支持頭文件依賴。
下面再添加CFLAGS,即編譯參數。比如加上編譯參數-Werror,把所有的警告當成錯誤。

現在重新make,發(fā)現以前的警告就變成了錯誤,必須要解決這些錯誤編譯才能進行。在a.c里面聲明一下函數:
void func_b();?
void func_c();
重新make,錯誤就沒有了。
除了編譯參數-Werror,還可以加上-I參數,指定頭文件路徑,-Iinclude表示當前的inclue文件夾下。 此時就可以把c.c文件里的#include ".h"改為#include <c.h>,前者表示當前目錄,后者表示編譯器指定的路徑和GCC路徑。?
視頻教程???
