2010-03-03 59 views
3

在一個makefile,我建立一個構建目錄中的所有我的.o文件:編譯文件目錄和依賴性列表

program: class1.o class2.o class3.o 
    g++ $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o -o [email protected] 

這將是冷靜,以從依賴列表$(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o ...

我知道$^會給我的所有依賴關係的列表,用空格分隔,但我無法處理子目錄。

可能嗎?

如果我有program: class1.o class2.o class3.o configure,我可以排除configure從列表中?

謝謝:)

編輯:邁克爾的解決方案效果很好,但這樣做,make沒有找到依賴性並有每次創造一切......讓時是不是有一個更簡單的方法, 隱含規則喜歡program: class1.o class2.o class3.o,告訴它把二進制文件中構建目錄?

+0

這是行不通的? g ++ $(^:%= $(BUILDDIR)%)-o $ @ – 2011-04-10 12:13:23

回答

5

把我的頭

g++ $(addprefix $(BUILDDIR), $^) -o [email protected] 

應該做它的頂部。

Make manual具有這些功能在第8.3節的列表。

+0

謝謝!我會更仔細地看看這本手冊:) – Klaus 2010-03-03 21:29:43

+2

是的......對錯過它並不覺得太糟糕。和大多數GNU文檔一樣,我發現Make手冊對於已經知道所有內容的人來說都是很好的組織,只需要查看確切的拼寫或其他內容。如果你不確定什麼是被調用的,那麼在GNU手冊中找不到所有東西是不可能的。 – 2010-03-04 01:02:41

+0

我用它來解決相反的問題:我有一個本地文件列表,我需要爲它們添加一個目錄路徑,並在依賴項中使用整個東西。 – mgold 2012-07-10 03:23:00

5

你已經打了製作的一大缺點,在兩個(或也許三)。這是善於利用文件使文件這裏,而不是周圍的其他方式,而如果規則使得比確切目標以外的東西它會很困惑(和它的自動變量應該在前提條件工作,但他們不」 T)。幸運的是,我們可以解決這些問題。當您使用邁克爾Kohne的解決方案,因爲它是尋找class1.o,而不是$(BUILDDIR)class1.o

製作找不到的先決條件。 (如果你只是告訴它使用VPATH查看$(BUILDDIR),你可能會遇到其他問題。)

最簡單,最粗糙的解決方案(如果你不太經驗,我建議)是強力:

 
NAMES = class1 class2 
OBJECTS = $(patsubst %,$(BUILDDIR)%.o,$(NAMES)) 

program: $(OBJECTS) configure 
    g++ $(OBJECTS) -o [email protected] 

$(OBJECTS):$(BUILDDIR)%.o:%.cc 
    g++ -c $^ -o [email protected] 

有更優雅的解決方案使用更先進的技術,但現在應該這樣做。