有哪些好的做兼職網(wǎng)站百度2022年版本下載
一、什么是makefile/make
會不會寫makefile,從一個側(cè)面說明了一個人是否具備完成大型工程的能力 一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的 規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜 的功能操作 makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編 譯,極大的提高了軟件開發(fā)的效率。 make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數(shù)的IDE都有這個命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢?#xff0c;makefile都成為了一 種在工程方面的編譯方法。 make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構(gòu)建。
而make則是指令,makefile里保存的是依賴關系和依賴方法。
1.1makefile文件的編寫
首先我們先touch一個makefile.c的文件,以往我們需要在命令行進行g(shù)cc去手動編譯形成可執(zhí)行程序,但通過makefile文件我們可以很好的釋放自己的雙手。
第一行表明依賴關系:要形成的文件為mybin,依賴文件為沒有test.c。冒號的左邊被稱為目標文件,右邊為依賴文件列表
第二行則是要執(zhí)行的指令即依賴方法,使用gcc編譯器形成mybin文件,源文件為mytest.c。
這樣我們直接調(diào)用make指令就可以形成名為mymakefile的可執(zhí)行程序。
然后運行mymakefile,就可以執(zhí)行剛剛自己編寫的makefile.c的程序了。
當我們再次make時,因為已經(jīng)生成了可執(zhí)行程序,而且我們對依賴文件并沒有進行修改,所以這里就會make失敗。此時如果我們對依賴文件做出修改就可以重新編譯成功。
1.2makeclean
那我們?nèi)绾吻謇眄椖磕?#xff1f;
我們可以通過設置自動化清理make clean來刪除剛剛生成的可執(zhí)行文件。
這時如果我們將 clean與mymakefile調(diào)換位置,再次去make就默認去調(diào)用clean。
所以make和Makefile形成目標文件的時候,默認時從上到下掃描makefile文件的,默認形成的時第一個目標文件。
那make和makefile怎么知道可執(zhí)行程序即依賴文件是不是最新的呢?是通過對比時間對比出來的,只要可執(zhí)行程序最近的修改時間比所有源文件的最近修改時間新,就說明它就是最新的。在邏輯上可執(zhí)行和源文件的時間是不可能一樣的。
1.3文件時間
stat查看文件詳細信息可以看到時間。
文件=內(nèi)容+屬性,如果對內(nèi)容更新,Modify的時間就會更新,如果對文件的屬性做更新,Change的時間就會改變。
比如ll,就可以查看文件詳細屬性信息,如果我們用chmod對文件的權(quán)限進行修改,再次查看文件的詳細信息就可以看到chang顯示的時間被更改。而我們對內(nèi)容即Modify更改時,change也會改變,因為更改內(nèi)容會對文件大小造成改變,屬性change也會跟著改變
?Access是指上一次查看文件的時間,而查看文件的次數(shù)比更改文件內(nèi)容屬性的次數(shù)要多得多,如果每次查看都要更改Access, 那如果短時間內(nèi)多次查看文件就會導致操作系統(tǒng)反復向磁盤更改文件的Access信息,導致系統(tǒng)本身變得低效。所以并不會每次都更新。
所以make指令在判斷是否要重新生成目標文件時,比較的是依賴文件和已經(jīng)生成的目標文件的Modify時間,當然我們也可以使用touch對依賴文件的Modify時間進行刷新,刷新后再使用make去重新覆蓋生成目標文件。
而在非常大型的項目中,上百萬行的代碼,編譯器在編譯的時候可能會耗費十幾二十分鐘,如果我們對其中一個文件做修改,再次編譯,編譯器會根據(jù)時間判斷修改了哪個,然后將其重新編譯然后和其他沒有修改的已經(jīng)編譯好的文件進行融合鏈接,大大提高了效率節(jié)省了時間。所以判斷新舊時間是很有必要的。
二、make語法補充
2.1 .PHONY
?.PHONY用來修飾目標文件,成為一個偽目標,總是被執(zhí)行。這樣每次調(diào)用相關指令都會無腦進行重新編譯不會再去檢查新舊文件的相關時間屬性。
2.2$@ $^
當出現(xiàn)文件名比較長或者較為復雜時,我們可以使用?$@ $^來讓編譯器根據(jù)上面的依賴關系進行推導,$@表示目標文件 $^表示依賴文件。
也可以通過自定義變量然后進行替換,類似于宏的用法,依然可以實現(xiàn)make功能。
2.3make和makefile的語法推導
最終要形成的目標文件為mymakefile,我們可以根據(jù)程序的編譯順序,預處理編譯匯編鏈接四個步驟來反向?qū)⑽募?c開始進行推導,形成最終的可執(zhí)行程序需要.o文件,形成.o需要.s,形成,s需要.i,形成.i需要.c。所以從源文件到最終可執(zhí)行是編譯器這樣一步步進行處理過來的,這就是make語法的推導過程。
?最后就對依賴關系進行推導然后逆向執(zhí)行依賴方法,最終形成目標文件mymakefile。
當然我們平日里不需要這樣的寫法來折磨自己。只需了解其原理就ok。