在軟體的工程中的原始檔是很多的,其按照型別、功能、模組分別放在若干個目錄和檔案中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行更複雜的功能操作,這就有了我們的系統編譯的工具。
在linux和unix中,有乙個強大的實用程式,叫make,可以用它來管理多模組程式的編譯和鏈結,直至生成可執行檔案。
make程式需要乙個編譯規則說明檔案,稱為makefile,makefile檔案中描述了整個軟體工程的編譯規則和各個檔案之間的依賴關係。
makefile就像是乙個shell指令碼一樣,其中可以執行作業系統的命令,它帶來的好處就是我們能夠實現「自動化編譯」,一旦寫好,只要乙個make命令,整個軟體功能就完全自動編譯,提高了軟體開發的效率。
make是乙個命令工具,是乙個解釋makefile中指令的命令工具,一般來說大多數編譯器都有這個命令,使用make可以是重新編譯的次數達到最小化。
makefile檔案的規則可以非常複雜,比c程式還要複雜,我通過示例來介紹它的簡單用法。
檔名:makefile,內容如下:
all:book1 book46
book1:book1.c
gcc -o book1 book1.c
book46:book46.c _public.h _public.c
gcc -o book46 book46.c _public.c
clean:
rm -f book1 book46
第一行
all:book book46
all: 這是固定的寫法。
book1 book46表示需要編譯目標程式的清單,中間用空格分隔開,如果清單很長,可以用\換行。
第二行
makefile檔案中的空行就像c程式中的空行一樣,只是為了書寫整潔,沒有什麼意義。
第三行
book1:book1.c
book1:表示需要編譯的目標程式。
如果要編譯目標程式book1,需要依賴源程式book1.c,當book1.c的內容發生了變化,執行make的時候就會重新編譯book1。
第四行
gcc -o book1 book1.c
這是乙個編譯命令,和在作業系統命令列輸入的命令一樣,但是要注意乙個問題,在gcc之前要用tab鍵,看上去像8個空格,實際不是,一定要用tab,空格不行。
第六行
book46:book46.c _public.h _public.c
與第三行的含義相同。
book46:表示編譯的目標程式。
如果要編譯目標程式book46,需要依賴源程式book46.c、_public.h和_public.c三個檔案,只要任何乙個的內容發生了變化,執行make的時候就會重新編譯book46。
第七行
gcc -o book46 book46.c _public.c
與第四行的含義相同。
第九行
clean:
清除目標檔案,清除的命令由第十行之後的指令碼來執行。
第十行
rm -f book1 book46
清除目標檔案的指令碼命令,注意了,rm之前也是乙個tab鍵,不是空格。
makefile準備好了,在命令提示符下執行make就可以編譯makefile中all引數指定的目標檔案。
程式make編譯目標程式。
再執行一次make。
因為全部的目標程式都是最新的,所以提示沒有目標可以編譯。
執行make clean,執行清除目標檔案的指令。
再執行make重新編譯。
修改_public.c程式,隨便改點什麼,只要改了就行。
然後再make
注意了,因為book46依賴的源程式之一_public.c改變了,所以book46重新編譯。
book1沒有重新編譯,因為book1依賴的原始檔並沒有改變。
makefile中,變數就是乙個名字,變數的值就是乙個文字字串。在makefile中的目標,依賴,命令或其他地方引用變數時,變數會被它的值替代。
我通過示例來介紹它的簡單用法。
cc=gcc
flag=
-gall:book1 book46
book1:book1.c
$(cc) $(flag)
-o book1 book1.c
book46:book46.c _public.h _public.c
$(cc) $(flag)
-o book46 book46.c _public.c
clean:
rm -f book1 book46
第一行
cc=gcc
定義變數cc,賦值gcc。
第二行
flag=
-g
定義變數flag,賦值-g。
第七行
$(cc) $(flag)
-o book1 book1.c
$(cc)和$(flag)就是使用變數cc和flag的值,類似於c語言的巨集定義,替換後的結果是:
在makefile檔案中,使用變數的好處有兩個:1)如果在很多編譯指令採用了變數,只要修改變數的值,就相當於修改全部的編譯指令;2)把比較長的、公共的編譯指令採用變數來表示,可以讓makefile更簡潔。
makefile檔案的編寫可以很複雜,複雜到我不想看,在實際開發中,用不著那麼複雜的makefile,我追求簡單實用的方法,騰出更多的時間和精力去做更重要的事情,那些把makefile檔案寫得很複雜的程式設計師在我看來是吃飽了撐的。
把您這段時間寫的程式全部編寫到makefile中,以後再也不要在命令提示符下用gcc了。
C語言makefile檔案
在軟體的工程中的原始檔是很多的,其按照型別 功能 模組分別放在若干個目錄和檔案中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行更複雜的功能操作,這就有了我們的系統編譯的工具。在linux和unix中,有乙個強大的實用程式,叫make,可以用它來管理多模組程式的編譯和鏈結,直至...
C語言makefile檔案
在軟體的工程中的原始檔是很多的,其按照型別 功能 模組分別放在若干個目錄和檔案中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行更複雜的功能操作,這就有了我們的系統編譯的工具。在linux和unix中,有乙個強大的實用程式,叫make,可以用它來管理多模組程式的編譯和鏈結,直至...
C語言makefile檔案
在軟體的工程中的原始檔是很多的,其按照型別 功能 模組分別放在若干個目錄和檔案中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行更複雜的功能操作,這就有了我們的系統編譯的工具。在linux和unix中,有乙個強大的實用程式,叫make,可以用它來管理多模組程式的編譯和鏈結,直至...