資料介紹
3.5 make工程管理器
到此為止,讀者已經了解了如何在Linux下使用編輯器編寫代碼,如何使用gcc把代碼編譯成可執行文件,還學習了如何使用gdb來調試程序,那么,所有的工作看似已經完成了,為什么還需要make這個工程管理器呢?
所謂工程管理器,顧名思義,是用于管理較多的文件。讀者可以試想一下,由成百上千個文件構成的項目,如果其中只有一個或少數幾個文件進行了修改,按照之前所學的gcc編譯工具,就不得不把這所有的文件重新編譯一遍,因為編譯器并不知道哪些文件是最近更新的,而只知道需要包含這些文件才能把源代碼編譯成可執行文件,于是,程序員就不得不重新輸入數目如此龐大的文件名以完成最后的編譯工作。
編譯過程分為編譯、匯編、鏈接階段,其中編譯階段僅檢查語法錯誤以及函數與變量是否被正確地聲明了,在鏈接階段則主要完成函數鏈接和全局變量的鏈接。因此,那些沒有改動的源代碼根本不需要重新編譯,而只要把它們重新鏈接進去就可以了。所以,人們就希望有一個工程管理器能夠自動識別更新了的文件代碼,而不需要重復輸入冗長的命令行,這樣,make工程管理器就應運而生了。
實際上,make工程管理器也就是個“自動編譯管理器”,這里的“自動”是指它能夠根據文件時間戳自動發現更新過的文件而減少編譯的工作量,同時,它通過讀入makefile文件的內容來執行大量的編譯工作。用戶只需編寫一次簡單的編譯語句就可以了。它大大提高了實際項目的工作效率,而且幾乎所有Linux下的項目編程均會涉及它,希望讀者能夠認真學習本節內容。
3.5.1 makefile基本結構
makefile是make讀入的惟一配置文件,因此本節的內容實際就是講述makefile的編寫規則。在一個makefile中通常包含如下內容:
n 需要由make工具創建的目標體(target),通常是目標文件或可執行文件;
n 要創建的目標體所依賴的文件(dependency_file);
n 創建每個目標體時需要運行的命令(command),這一行必須以制表符(tab鍵)開頭。
它的格式為:
target: dependency_files
command /* 該行必須以tab鍵開頭*/
例如,有兩個文件分別為hello.c和hello.h,創建的目標體為hello.o,執行的命令為gcc編譯指令:gcc –c hello.c,那么,對應的makefile就可以寫為:
#The simplest example
hello.o: hello.c hello.h
gcc –c hello.c –o hello.o
接著就可以使用make了。使用make的格式為:make target,這樣make就會自動讀入makefile(也可以是首字母大寫的Makefile)并執行對應target的command語句,并會找到相應的依賴文件。如下所示:
?。踨oot@localhost makefile]# make hello.o
gcc –c hello.c –o hello.o
[root@localhost makefile]# ls
hello.c hello.h hello.o makefile
可以看到,makefile執行了“hello.o”對應的命令語句,并生成了“hello.o”目標體。
注意在makefile中的每一個command前必須有“Tab”符,否則在運行make命令時會出錯。
3.5.2 makefile變量
上面示例的makefile在實際中是幾乎不存在的,因為它過于簡單,僅包含兩個文件和一個命令,在這種情況下完全不必要編寫makefile而只需在shell中直接輸入即可,在實際中使用的makefile往往是包含很多的文件和命令的,這也是makefile產生的原因。下面就可給出稍微復雜一些的makefile進行講解。
david:kang.o yul.o
gcc kang.o bar.o -o myprog
kang.o : kang.c kang.h head.h
gcc –Wall –O -g –c kang.c -o kang.o
yul.o : bar.c head.h
gcc - Wall –O -g –c yul.c -o yul.o
在這個makefile中有3個目標體(target),分別為david、kang.o和yul.o,其中第一個目標體的依賴文件就是后兩個目標體。如果用戶使用命令“make david”,則make管理器就是找到david目標體開始執行。
這時,make會自動檢查相關文件的時間戳。首先,在檢查“kang.o”、“yul.o”和“david”3個文件的時間戳之前,它會向下查找那些把“kang.o”或“yul.o”作為目標文件的時間戳。比如,“kang.o”的依賴文件為“kang.c”、“kang.h”、“head.h”。如果這些文件中任何一個的時間戳比“kang.o”新,則命令“gcc –Wall –O -g –c kang.c -o kang.o”將會執行,從而更新文件“kang.o”。在更新完“kang.o”或“yul.o”之后,make會檢查最初的“kang.o”、“yul.o”和“david”3個文件,只要文件“kang.o”或“yul.o”中的至少有一個文件的時間戳比“david”新,則第二行命令就會被執行。這樣,make就完成了自動檢查時間戳的工作,開始執行編譯工作。這也就是make工作的基本流程。
接下來,為了進一步簡化編輯和維護makefile,make允許在makefile中創建和使用變量。變量是在makefile中定義的名字,用來代替一個文本字符串,該文本字符串稱為該變量的值。在具體要求下,這些值可以代替目標體、依賴文件、命令以及makefile文件中其他部分。在makefile中的變量定義有兩種方式:一種是遞歸展開方式,另一種是簡單方式。
遞歸展開方式定義的變量是在引用該變量時進行替換的,即如果該變量包含了對其他變量的引用,則在引用該變量時一次性將內嵌的變量全部展開,雖然這種類型的變量能夠很好地完成用戶的指令,但是它也有嚴重的缺點,如不能在變量后追加內容(因為語句:CFLAGS = $(CFLAGS) -O在變量擴展過程中可能導致無窮循環)。
為了避免上述問題,簡單擴展型變量的值在定義處展開,并且只展開一次,因此它不包含任何對其他變量的引用,從而消除變量的嵌套引用。
遞歸展開方式的定義格式為:VAR=var。
簡單擴展方式的定義格式為:VAR:=var。
make中的變量使用均使用的格式為:$(VAR)。
注意變量名是不包括“:”、“#”、“=”以及結尾空格的任何字符串。同時,變量名中包含字母、數字以及下劃線以外的情況應盡量避免,因為它們可能在將來被賦予特別的含義。
變量名是大小寫敏感的,例如變量名“foo”、“FOO”、和“Foo”代表不同的變量。
推薦在makefile內部使用小寫字母作為變量名,預留大寫字母作為控制隱含規則參數或用戶重載命令選項參數的變量名。
下面給出了上例中用變量替換修改后的makefile,這里用OBJS代替kang.o和yul.o,用CC代替gcc,用CFLAGS代替“-Wall -O –g”。這樣在以后修改時,就可以只修改變量定義,而不需要修改下面的定義實體,從而大大簡化了makefile維護的工作量。
經變量替換后的makefile如下所示:
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david : $(OBJS)
$(CC) $(OBJS) -o david
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
可以看到,此處變量是以遞歸展開方式定義的。
makefile中的變量分為用戶自定義變量、預定義變量、自動變量及環境變量。如上例中的OBJS就是用戶自定義變量,自定義變量的值由用戶自行設定,而預定義變量和自動變量為通常在makefile都會出現的變量,它們的一部分有默認值,也就是常見的設定值,當然用戶可以對其進行修改。
預定義變量包含了常見編譯器、匯編器的名稱及其編譯選項。表3.15列出了makefile中常見預定義變量及其部分默認值。
到此為止,讀者已經了解了如何在Linux下使用編輯器編寫代碼,如何使用gcc把代碼編譯成可執行文件,還學習了如何使用gdb來調試程序,那么,所有的工作看似已經完成了,為什么還需要make這個工程管理器呢?
所謂工程管理器,顧名思義,是用于管理較多的文件。讀者可以試想一下,由成百上千個文件構成的項目,如果其中只有一個或少數幾個文件進行了修改,按照之前所學的gcc編譯工具,就不得不把這所有的文件重新編譯一遍,因為編譯器并不知道哪些文件是最近更新的,而只知道需要包含這些文件才能把源代碼編譯成可執行文件,于是,程序員就不得不重新輸入數目如此龐大的文件名以完成最后的編譯工作。
編譯過程分為編譯、匯編、鏈接階段,其中編譯階段僅檢查語法錯誤以及函數與變量是否被正確地聲明了,在鏈接階段則主要完成函數鏈接和全局變量的鏈接。因此,那些沒有改動的源代碼根本不需要重新編譯,而只要把它們重新鏈接進去就可以了。所以,人們就希望有一個工程管理器能夠自動識別更新了的文件代碼,而不需要重復輸入冗長的命令行,這樣,make工程管理器就應運而生了。
實際上,make工程管理器也就是個“自動編譯管理器”,這里的“自動”是指它能夠根據文件時間戳自動發現更新過的文件而減少編譯的工作量,同時,它通過讀入makefile文件的內容來執行大量的編譯工作。用戶只需編寫一次簡單的編譯語句就可以了。它大大提高了實際項目的工作效率,而且幾乎所有Linux下的項目編程均會涉及它,希望讀者能夠認真學習本節內容。
3.5.1 makefile基本結構
makefile是make讀入的惟一配置文件,因此本節的內容實際就是講述makefile的編寫規則。在一個makefile中通常包含如下內容:
n 需要由make工具創建的目標體(target),通常是目標文件或可執行文件;
n 要創建的目標體所依賴的文件(dependency_file);
n 創建每個目標體時需要運行的命令(command),這一行必須以制表符(tab鍵)開頭。
它的格式為:
target: dependency_files
command /* 該行必須以tab鍵開頭*/
例如,有兩個文件分別為hello.c和hello.h,創建的目標體為hello.o,執行的命令為gcc編譯指令:gcc –c hello.c,那么,對應的makefile就可以寫為:
#The simplest example
hello.o: hello.c hello.h
gcc –c hello.c –o hello.o
接著就可以使用make了。使用make的格式為:make target,這樣make就會自動讀入makefile(也可以是首字母大寫的Makefile)并執行對應target的command語句,并會找到相應的依賴文件。如下所示:
?。踨oot@localhost makefile]# make hello.o
gcc –c hello.c –o hello.o
[root@localhost makefile]# ls
hello.c hello.h hello.o makefile
可以看到,makefile執行了“hello.o”對應的命令語句,并生成了“hello.o”目標體。
注意在makefile中的每一個command前必須有“Tab”符,否則在運行make命令時會出錯。
3.5.2 makefile變量
上面示例的makefile在實際中是幾乎不存在的,因為它過于簡單,僅包含兩個文件和一個命令,在這種情況下完全不必要編寫makefile而只需在shell中直接輸入即可,在實際中使用的makefile往往是包含很多的文件和命令的,這也是makefile產生的原因。下面就可給出稍微復雜一些的makefile進行講解。
david:kang.o yul.o
gcc kang.o bar.o -o myprog
kang.o : kang.c kang.h head.h
gcc –Wall –O -g –c kang.c -o kang.o
yul.o : bar.c head.h
gcc - Wall –O -g –c yul.c -o yul.o
在這個makefile中有3個目標體(target),分別為david、kang.o和yul.o,其中第一個目標體的依賴文件就是后兩個目標體。如果用戶使用命令“make david”,則make管理器就是找到david目標體開始執行。
這時,make會自動檢查相關文件的時間戳。首先,在檢查“kang.o”、“yul.o”和“david”3個文件的時間戳之前,它會向下查找那些把“kang.o”或“yul.o”作為目標文件的時間戳。比如,“kang.o”的依賴文件為“kang.c”、“kang.h”、“head.h”。如果這些文件中任何一個的時間戳比“kang.o”新,則命令“gcc –Wall –O -g –c kang.c -o kang.o”將會執行,從而更新文件“kang.o”。在更新完“kang.o”或“yul.o”之后,make會檢查最初的“kang.o”、“yul.o”和“david”3個文件,只要文件“kang.o”或“yul.o”中的至少有一個文件的時間戳比“david”新,則第二行命令就會被執行。這樣,make就完成了自動檢查時間戳的工作,開始執行編譯工作。這也就是make工作的基本流程。
接下來,為了進一步簡化編輯和維護makefile,make允許在makefile中創建和使用變量。變量是在makefile中定義的名字,用來代替一個文本字符串,該文本字符串稱為該變量的值。在具體要求下,這些值可以代替目標體、依賴文件、命令以及makefile文件中其他部分。在makefile中的變量定義有兩種方式:一種是遞歸展開方式,另一種是簡單方式。
遞歸展開方式定義的變量是在引用該變量時進行替換的,即如果該變量包含了對其他變量的引用,則在引用該變量時一次性將內嵌的變量全部展開,雖然這種類型的變量能夠很好地完成用戶的指令,但是它也有嚴重的缺點,如不能在變量后追加內容(因為語句:CFLAGS = $(CFLAGS) -O在變量擴展過程中可能導致無窮循環)。
為了避免上述問題,簡單擴展型變量的值在定義處展開,并且只展開一次,因此它不包含任何對其他變量的引用,從而消除變量的嵌套引用。
遞歸展開方式的定義格式為:VAR=var。
簡單擴展方式的定義格式為:VAR:=var。
make中的變量使用均使用的格式為:$(VAR)。
注意變量名是不包括“:”、“#”、“=”以及結尾空格的任何字符串。同時,變量名中包含字母、數字以及下劃線以外的情況應盡量避免,因為它們可能在將來被賦予特別的含義。
變量名是大小寫敏感的,例如變量名“foo”、“FOO”、和“Foo”代表不同的變量。
推薦在makefile內部使用小寫字母作為變量名,預留大寫字母作為控制隱含規則參數或用戶重載命令選項參數的變量名。
下面給出了上例中用變量替換修改后的makefile,這里用OBJS代替kang.o和yul.o,用CC代替gcc,用CFLAGS代替“-Wall -O –g”。這樣在以后修改時,就可以只修改變量定義,而不需要修改下面的定義實體,從而大大簡化了makefile維護的工作量。
經變量替換后的makefile如下所示:
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david : $(OBJS)
$(CC) $(OBJS) -o david
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
可以看到,此處變量是以遞歸展開方式定義的。
makefile中的變量分為用戶自定義變量、預定義變量、自動變量及環境變量。如上例中的OBJS就是用戶自定義變量,自定義變量的值由用戶自行設定,而預定義變量和自動變量為通常在makefile都會出現的變量,它們的一部分有默認值,也就是常見的設定值,當然用戶可以對其進行修改。
預定義變量包含了常見編譯器、匯編器的名稱及其編譯選項。表3.15列出了makefile中常見預定義變量及其部分默認值。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 用于 Linux 管理 API 手冊的 PTP 時鐘管理器
- 用于 Linux 管理 API 手冊的 PTP 時鐘管理器
- TOPWAY智能LCD開發工具-SGTools-V9.43
- 嵌入式linux開發工具問題匯總
- 課堂筆記五之嵌入式Linux開發工具
- 嵌入式Linux開發工具(課上總結)
- 嵌入式Linux_C語言開發工具
- 嵌入式linux開發工具總結
- 微軟內核構架之Cache管理器
- ARM常用開發工具及相應開發環境配置資料 40次下載
- DSP的開發工具及開發環境的詳細資料說明 23次下載
- dsPIC30F系列參考手冊之開發工具支持
- 如何使用KEELOQ3開發工具包作為開發工具來在目標板上仿真和調試固件
- IAR EWARM軟件免費下載(嵌入式應用編程開發工具) 24次下載
- ARM開發工具解讀 3次下載
- make、make all和make clean的使用方法 2023次閱讀
- 配置Ubuntu系統環境和安裝的開發工具 1913次閱讀
- 圖形界面開發工具GUI Guider的使用教程 1.9w次閱讀
- Windows下編譯工具CMake的安裝和最簡使用 8643次閱讀
- Intellij IDEA 開發工具實例 912次閱讀
- Linux 下的make 工具和 Makefile 1208次閱讀
- 閑談Linux操作系統中的顯示管理器及如何更換 3248次閱讀
- 米爾科技ARM DS-5開發工具介紹 1452次閱讀
- 米爾科技ARM DS-5 官方開發工具介紹 2376次閱讀
- web前端開發工具排行:8款html開發工具推薦下載 8.5w次閱讀
- 什么是re文件管理器_re管理器有什么用 1.8w次閱讀
- re管理器進入編輯文件方法 4735次閱讀
- 圖解android開發工具 1432次閱讀
- Linux內核開發工具介紹 4720次閱讀
- SoPC應用設計的PLD開發工具要求詳解 1810次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論