目錄
1.為什么要使用make
2.makefile的基本語法與變數
1.為什么要使用make
假設我們的執行檔案里面包含2個源檔案,分別是main.c , test.c ,

如果想要這個程式運行起來,那么就需要先編譯:
# 先對源檔案進行編譯,產生test.o,main.o檔案
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ gcc -c test.c
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ gcc -c main.c
# 將test.o main.o檔案進行鏈接,將生成的可執行程式檔案定為mytest
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ gcc test.o main.o -o mytest
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ ./mytest <==> 執行可執行檔案 結果如下
hello sjp
hello sjp
hello sjp
hello sjp
hello sjp
hello sjp
編譯程序需要進行好多操作,如果有更多的源檔案,那么我們就需要輸入更多 gcc -c 源檔案 的操作,而且如果要對源檔案進行重新編譯,則上訴的操作需要在操作一遍,光是找出這些命令就夠煩人了,那么有沒有一個步驟就完成上面所有操作?make就可以幫我們完成以上所有的操作,
我必須先說明的是make是一條命令,makefile檔案,
要想使用make這條命令,就需要在當前目錄下創建一個makefile或者Makefile檔案,內容如下:
1 mytest:main.o test.o
2 gcc -o mytest main.o test.o # 前面的空格必須以【Tab】鍵開頭
3
4 main.o:main.c
5 gcc -c main.c
6 test.o:test.c
7 gcc -c test.c
當我們執行make指令后,make會去當前目錄下去makefile或Makefile檔案,并根據makefile或Makefile中的內容去執行相關的命令
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ make
gcc -c main.c
gcc -c test.c
gcc -o mytest main.o test.o
# 不修改源檔案中的任何內容,再執行make指令,則不會再繼續對源檔案進行編譯
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ make
make: `mytest' is up to date.
我們只寫了mytest需要的目標檔案,結果make會主動的去判斷每個目標檔案相關的源代碼檔案,并直接進行編譯,最后在執行鏈接的操作,
編譯完成后,如果我們再去修改源檔案中的代碼,那么make會主動的去判斷哪一個源目標檔案被修改了,并僅重新編譯該檔案, 如此這樣,可以節省很多的編譯時間,某些程式在進行編譯操作時,會消耗很多的cpu資源,
例如:我們將test.c中的代碼修改了一下,那么我們在執行一次make命令,則只會重新編譯更新test.c檔案產生test.o檔案,不會對main.c檔案進行重新編譯,最后再將main.o和test.o重新鏈接,
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ make
gcc -c test.c
gcc -o mytest main.o test.o
執行make命令后,沒有將main.c重新編譯,
總結make的好處:
- make可以簡化編譯所需要執行的命令,
- 若在編譯完成后,修改了某個源檔案中的內容,我們再執行make命令,則make只會去編譯更新那個被修改的源檔案,其它的目標檔案不會被修改,
- 最后可以依照依賴性來更新執行檔案
2.makefile的基本語法與變數
基本的makedile規則:
目標:依賴檔案串列
<Tab>依賴方法
第一行 為依賴關系,
例如;
1 mytest:main.o test.o
2 gcc -o mytest main.o test.o # 前面的空格必須以【Tab】鍵開頭
mytest:main.o test.o 是依賴關系
上面中的第一行中的mytest是目標,main.o test.o是依賴檔案
gcc -o mytest main.o test.o 是生成mytest檔案的方法,也就是依賴方法,
mytest依賴main.o和test.o的鏈接才能生成mytest,
如果我們想要一個命令直接清理掉所有的目標檔案(.o檔案)與執行檔案(.exe檔案),那么我可以需要建立clean目標,如下:
1 mytest:main.o test.o
2 gcc -o mytest main.o test.o
3
4 main.o:main.c
5 gcc -c main.c
6 test.o:test.c
7 gcc -c test.c
8
9 .PHONY:clean
10 clean:
11 rm -f test.o main.o mytest
其中.PHONY是修飾clean的,使clean可以一直重復使用,當然.PHONY:clean去掉也是可以的,
當我們要將生成的test.o main.o mytest刪掉時,用make clean命令即可,
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ make clean
rm -f test.o main.o mytest
在makefile檔案中重復的變數有很多,那么我們是否可以將它們簡化呢?
例子;
1 mytest:main.o test.o
2 gcc -o mytest main.o test.o
上面的命令可以改成:
1 mytest:main.o test.o
2 gcc -o $@ $^
$@:表示目標,代表上面的 mytest
$^:表示依賴檔案串列中的所有依賴檔案,代表上面的 main.o test.o
當我們執行make,效果是一樣的,如下:
[sjp@iZwz97d32td9ocseu9tkn4Z ~]$ make
gcc -c main.c
gcc -c test.c
gcc -o mytest main.o test.o
使用$^好處:
如果是依賴檔案串列中有幾十個檔案甚至更多,那么在依賴方法中直接使用$^可以直接取代依賴檔案串列中所有的檔案,不需要將所有的依賴檔案一 一列出來 所以使用$^是非常方便的,
使用$^和$@的好處:
如果我們修改(洗掉,添加)依賴關系中的目標或依賴串列中的依賴檔案時,我們可以不用修改(洗掉添加)依賴方法中的檔案,
make和makefile說完之后,我們還需要解決一個問題,
問題:
我們知道,生成可執行檔案有兩種方法:
方法一;將源檔案進行編譯并鏈接形成可執行檔案,沒有保存其中的編譯產生的目標檔案(.o檔案),如下;
gcc main.c test.c -o mytest 直接將main.c和test.c檔案編譯并鏈接形成mytest檔案,沒有保存其中編譯產生的目標檔案(.o檔案)
方法二:將源文檔案進行編譯產生目標檔案,將它保存下來,然后再將目標檔案進行鏈接,
gcc -c test.c
gcc -c main.c
gcc test.o main.o -o mytest
先將test.c main.c 編譯產生目標檔案(.o檔案),然后再將目標檔案進行鏈接,
請問方法二相對于方法一有什么優勢?
方法二是將目標檔案給保存起來,我們生成可執行檔案時,將目標檔案鏈接起來,如果我們其中有一個檔案修改了代碼后,我們只需要
對被修改的源檔案進行編譯即可,不用再將所有的源檔案進行編譯,例如:如果有一個專案有100多個源檔案,如果我們將它編譯鏈接后
形成可執行程式后,發現功能并沒有符合我們的預期,我們在將其中的幾個源檔案進行修改,那么我們只需要對那幾個被修改的源檔案
再進行編譯即可,而方法一由于沒有保存相關的目標檔案,就需要將所有的源檔案進行再一次編譯,而將所有的源檔案在一次編譯可能
需要等上幾個小時等,所以為了能減少時間,我們在編譯的時候需要將其目標檔案進行保存,
好啦,今天的分享就到這里了,如果這篇文章幫到你的話,記得給筆者一個贊哦,關注我,我將不斷分享知識出來,感謝你的支持,
記得點個贊哦(●'?'●),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300475.html
標籤:其他
