有時看起來好像不是一個新的可執行文件,儘管我需要一個,但我不明白爲什麼。例如,當我更改Makefile時,但已經有一個可執行文件,並且當我執行'make'時,它不會創建更新的可執行文件。爲什麼/我什麼時候需要一個'乾淨'的目標?
Makefiles的全部目的不是讓我不必擔心那些東西嗎?
有時看起來好像不是一個新的可執行文件,儘管我需要一個,但我不明白爲什麼。例如,當我更改Makefile時,但已經有一個可執行文件,並且當我執行'make'時,它不會創建更新的可執行文件。爲什麼/我什麼時候需要一個'乾淨'的目標?
Makefiles的全部目的不是讓我不必擔心那些東西嗎?
重新編譯必須在源文件中完成,或任何命名爲依賴的頭文件,是不是對象文件更近,或者如果目標文件不存在。
它不會改變觸發它的Makefile。
make clean
刪除在此期間創建的所有對象文件。 通常,部分重新編譯沒什麼大不了的,即只重新編譯你改變的文件,最後把新創建的目標文件和預先存在的目標文件鏈接起來。但是,如果您想要絕對安全,則應該在運行make
之前再次運行make clean
。
保持舊對象文件(即從不運行make clean)的示例可能會成爲一個問題:假設您有一個已經存在的對象文件,該對象文件旨在與某個庫的1.0版鏈接。現在你更新你的機器,它會安裝1.1版本,其中一些功能與1.0版本不兼容。但是,由於您的目標文件是在編譯期望以前的版本,鏈接過程最終會失敗。
嗯,這是一個非常廣泛的問題。通常,您可以編寫一個makefile來跟蹤所有的依賴關係(包括它自己的修改時間)。然而,這不是微不足道的,錯誤可以抓取到你的makefile,就像任何其他代碼一樣。因此,有時候更容易清理所有內容,並在懷疑某些內容未正確構建時重新構建。
有很多other build tools,如scons這可能比makefile更健壯/自動。
使分析成爲Makefile中定義的依賴關係並從中創建一個依賴關係圖。
如果它檢測到輸出(二進制文件)需要的任何前提條件發生更改,它將被重建 - 或者至少是已更改的部分。因此,如果您的依賴包含Makefiles - 它可能不應該 - make會在您更改Makefile後更新二進制文件。
Makefiles的生活並不總是那麼容易,但無論如何,它可以幫助你。
我不相信你的榜樣。如果對庫的更新更改其接口,則無論如何您都必須更改代碼,這會導致重新編譯受影響的對象。所以不需要在那裏「乾淨」。 – eriktous
不一定 - 如果您正在處理的其他文件不依賴於特定的庫,則不會重新編譯受影響的對象。 – emboss
如果任何對象與新庫不兼容,則無論如何都應該更改它們的源以反映界面中的更改。做一個「乾淨的」不會讓它消失,鏈接仍然會失敗。 – eriktous