2011-12-29 271 views
1

由於據說順序依賴關係在makefile中很重要。我想了解:make中的依賴關係順序

finalObjectFile: x.o main.o y.o 
    g++ x.o main.o y.o -o finalObjectFile 

main.o: header/x.h source/main.cpp 
    g++ -c source/main.cpp 

x.o: header/x.h source/x.cpp 
    g++ -c source/x.cpp 

y.o: source/y.cpp header/x.h 
    g++ -c source/y.cpp 

在上面的代碼中,我已經換了頭文件x.h的位置:

x.o: header/x.h source/x.cpp 
     g++ -c source/x.cpp 

y.o: source/y.cpp header/x.h 
     g++ -c source/y.cpp 

但輸出沒有得到實現!

哪種類型的依賴關係實際上很重要?

+0

你從哪裏聽到這個消息?我從來沒有遇到任何問題... – 2011-12-29 06:51:15

+0

@EricJohnson看到這個:http://www.eng.hawaii.edu/Tutor/Make/3-3.html – 2011-12-29 07:00:12

+2

被引用的頁面中的術語是錯誤的。它是在2001年寫成的;它也應該在2001年從網絡上移除。或者修復。 – 2011-12-29 07:12:43

回答

3

在示出的情況下,存在源和頭之前源之前頭之間沒有顯著差異。規則說(舉例):

  • x.o必須比header/x.hsource/x.cpp更近。

這兩個依賴關係出現在哪個序列中並不重要;如果依賴性比x.o更新,則命令將被執行。

訂單何時重要?這有點棘手的例證,但可能是一個因素,如果你有多個生成中間文件,你去。如果執行的某些命令會影響多個文件,但您不能正確告知所有這些交互,則這可能尤其成爲一個問題。

但是,依賴性順序通常不是問題。

+0

看到這個:http://www.eng.hawaii.edu/Tutor/Make/3-3.html'列出依賴關係的順序很重要。 ' – 2011-12-29 07:00:45

+2

這是一塊牛肚,Anisha - 對不起,但它是可怕的壞。它指的是目標,而不是依賴關係。目標出現在makefile中的順序非常重要;這很重要,因爲makefile中的第一個目標是當你輸入'make'而不指定你想要的目標時將產生的目標。傳統上,第一個目標是「全部」。你可以通過在命令行上指定它來構建任何想要的目標:'make target1 target2'等。但是目標不是依賴關係。所以,忘記手冊中的內容 - 它說這一切都是錯誤的。 – 2011-12-29 07:08:23

+0

感謝Jon的啓發,所以結果是依賴關係的順序並不重要?我也有一個關於目標的問題,BTW> – 2011-12-29 07:14:33

2

它在真正的make文件中很重要,因爲你傾向於使用打包的規則。 在一條規則中,$<被替換爲第一個先決條件。因此:

compile = g++ -c $< -o [email protected] 

x.o : source/x.cpp header/x.h 
    $(compile) 

y.o : header/y.h source/y.cpp 
    $(compile) 

的第一條規則將編譯source/x.cpp,根據需要。第二條規則 將嘗試編譯header/y.h,這絕對不是 想要的。

由於這是一種更典型(和合理)的編寫 makefile的方式,所以您必須遵守順序,至少關於哪個元素首先來到 。

它可能關係(但不應該是一個很好 書面生成文件的情況下),另一種情況:在許多情況下,make將解決依賴於從左到右的順序 ;即給定:

x.o : source/x.cpp header/x1.h header/x2.h 
    ... 

make將首先檢查source/x.cpp是最新的,並在必要時建立它 ,然後做同樣的順序header/x1.hheader/x2.h, 。如果您有任何未聲明的依賴關係,需要在header/x2.h之前構建 header/x1.h,那麼更改它們的 訂單也會導致問題。但是,這是 makefile中的錯誤;應該明確依賴關係(例如,具有 header/x1.h : header/x2.h的規則)。因爲這個訂單不保證 否則;例如,在GNU make的情況下,如果您使用-j選項,則可能違反了該選項。 header/x.h,然後交換訂單可能會導致問題。

+0

你的答案的後半部分似乎有點不必要。不是不正確的,但我不認爲有必要討論錯誤的makefile的情況。自動變量'$ <'是我腦中首先想到的東西,儘管你提到的打包規則有點多餘。自動變量也可以直接在配方中使用。 – eriktous 2011-12-29 14:19:55

+0

@eriktous我基本上試圖解釋一個情況,他可能會看到對訂單的明顯依賴。我同意處理這個問題的正確方法是修復makefile。關於打包規則:自動變量可以用於任何規則,但除了打包規則之外,實際上並不需要。 – 2011-12-29 16:57:12