新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Linux下C編程基礎之:make工程管理器

        Linux下C編程基礎之:make工程管理器

        作者: 時間:2013-09-13 來源:網絡 收藏


        本文引用地址:http://www.104case.com/article/257149.htm

        3.5

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        到此為止,讀者已經了解了如何在下使用編輯器編寫代碼,如何使用gcc把代碼編譯成可執行文件,還學習了如何使用gdb來調試程序,那么,所有的工作看似已經完成了,為什么還需要make這個工程管理器呢?


        所謂工程管理器,顧名思義,是用于管理較多的文件。讀者可以試想一下,由成百上千個文件構成的項目,如果其中只有一個或少數幾個文件進行了修改,按照之前所學的gcc編譯工具,就不得不把這所有的文件重新編譯一遍,因為編譯器并不知道哪些文件是最近更新的,而只知道需要包含這些文件才能把源代碼編譯成可執行文件,于是,程序員就不得不重新輸入數目如此龐大的文件名以完成最后的編譯工作。


        編譯過程分為編譯、匯編、鏈接階段,其中編譯階段僅檢查語法錯誤以及函數與變量是否被正確地聲明了,在鏈接階段則主要完成函數鏈接和全局變量的鏈接。因此,那些沒有改動的源代碼根本不需要重新編譯,而只要把它們重新鏈接進去就可以了。所以,人們就希望有一個工程管理器能夠自動識別更新了的文件代碼,而不需要重復輸入冗長的命令行,這樣,就應運而生了。


        實際上,也就是個“自動編譯管理器”,這里的“自動”是指它能夠根據文件時間戳自動發現更新過的文件而減少編譯的工作量,同時,它通過讀入makefile文件的內容來執行大量的編譯工作。用戶只需編寫一次簡單的編譯語句就可以了。它大大提高了實際項目的工作效率,而且幾乎所有下的項目編程均會涉及它,希望讀者能夠認真學習本節內容。


        3.5.1makefile基本結構

        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–chello.c,那么,對應的makefile就可以寫為:


        #Thesimplestexample

        hello.o:hello.chello.h

        gcc–chello.c–ohello.o


        接著就可以使用make了。使用make的格式為:maketarget,這樣make就會自動讀入makefile(也可以是首字母大寫的)并執行對應target的command語句,并會找到相應的依賴文件。如下所示:


        [root@localhostmakefile]#makehello.o

        gcc–chello.c–ohello.o

        [root@localhostmakefile]#ls

        hello.chello.hhello.omakefile


        可以看到,makefile執行了“hello.o”對應的命令語句,并生成了“hello.o”目標體。


        注意

        在makefile中的每一個command前必須有“Tab”符,否則在運行make命令時會出錯。


        3.5.2makefile變量

        上面示例的makefile在實際中是幾乎不存在的,因為它過于簡單,僅包含兩個文件和一個命令,在這種情況下完全不必要編寫makefile而只需在shell中直接輸入即可,在實際中使用的makefile往往是包含很多的文件和命令的,這也是makefile產生的原因。下面就可給出稍微復雜一些的makefile進行講解。


        david:kang.oyul.o

        gcckang.obar.o-omyprog

        kang.o:kang.ckang.hhead.h

        gcc–Wall–O-g–ckang.c-okang.o

        yul.o:bar.chead.h

        gcc-Wall–O-g–cyul.c-oyul.o


        在這個makefile中有3個目標體(target),分別為david、kang.o和yul.o,其中第一個目標體的依賴文件就是后兩個目標體。如果用戶使用命令“makedavid”,則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–ckang.c-okang.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在變量擴展過程中可能導致無窮循環)。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程



        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 枝江市| 新田县| 普宁市| 静乐县| 岐山县| 三明市| 札达县| 上虞市| 祁阳县| 德江县| 滕州市| 仁寿县| 中宁县| 滦平县| 临海市| 大田县| 宿迁市| 舒兰市| 杭州市| 涿州市| 赤城县| 南宫市| 鹿泉市| 吴忠市| 松潘县| 甘谷县| 那曲县| 安福县| 邢台市| 西峡县| 章丘市| 新沂市| 开远市| 平顺县| 潮安县| 富平县| 融水| 怀仁县| 宜章县| 阿坝县| 深水埗区|