C語言makefile檔案

2021-10-23 01:36:35 字數 3219 閱讀 7494

在軟體的工程中的原始檔是很多的,其按照型別、功能、模組分別放在若干個目錄和檔案中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行更複雜的功能操作,這就有了我們的系統編譯的工具。

在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,可以用它來管理多模組程式的編譯和鏈結,直至...