2013-11-04 59 views
0

任何人都可以解釋爲什麼在使用$ <:

$(BUILD_DIR)/release/%.o: %.c $(HEADERS) 
    $(RELEASE_LINK.c) $< -c -o [email protected] 

遍歷兩個.o文件和.c文件中對建立來自AC文件OBJ文件,而$ <在:

$(program_C_OBJS) : $(program_C_SRCS) 
    $(RELEASE_LINK.c) $< -c -o [email protected] 

遍歷所有OBJ文件,但永遠只能翻出1依賴性,即1號C文件

是在第二個例子可以修改這樣的那麼匹配的obj和c文件對就像第一個例子中那樣?

+0

爲什麼你需要第二條規則呢?第一條規則應該已經足夠編譯所有需要的對象。 –

+0

你明白爲什麼這兩個片段的擴展不同嗎? – bph

+0

我遇到的問題是第一個示例工作正常,即它從c文件構建所有對象文件,但它不確定要構建哪個c文件,即構建它們的全部。我希望能夠限制只建立在$(program_C_SRCS) – bph

回答

1

$<變量不會「迭代」任何東西。它沒有做任何事情,只是展開到擴展目標的第一個前提條件的名稱。

第一條規則是模式規則。它適用於需要與該模式匹配的任何文件。

第二條規則(幾乎肯定不會像你想要的那樣做任何事情,除非這些變量包含模式)將特定的輸出文件映射到特定的輸入文件(在你的情況下,大概是你想要的有限輸入C文件集適用的規則)。

關於在任何給定的make運行期間哪些文件被編譯的選擇取決於哪些文件被告知要建立哪些文件以及它們的哪些依賴性決定了需要更新以使其發生。

+0

對於給定的一組c文件,如何從c文件隱含構建目標文件,例如, $(program_C_SRCS)在這個例子中?這正是我想在這裏實現的 – bph

+2

Etan:你最後一段不正確。具有多個目標的顯式規則與用一個目標多次編寫同一規則相同。所以'foo far faz:boo bar baz'與編寫三條規則相同:'foo:boo bar baz','far:boo bar baz'和'faz:boo bar baz'。對於隱式規則(模式規則),行爲如您所說:配方的一次調用應構建所有目標。這就是OPs示例中的每個編譯構建相同的源文件的原因; '$ <'擴展到每個規則中相同的第一個文件。 – MadScientist

+1

Hiett:你寫的問題似乎並不直接與你試圖解決的問題有關。我建議你編輯這個問題來更具體地描述你的目標。 – MadScientist

1

GNU Make - 10.5.3 Automatic Variables

$ <
第一要義的名字。如果目標從一個隱含的規則得到了它的食譜,這將是由隱規則

根據您想要完成的任務添加的第一要義,也有

$?
比目標更新的所有先決條件的名稱,它們之間有空格。
$^
所有先決條件的名稱,與它們之間的間隔

您可以通過說明他們作爲依賴於另一個目標現在

target1: $(program_C_OBJS) 

,當你建立一組特定的對象調用

make target1 

make嘗試創建的依賴關係target1,而這又可以使用你的第一條規則逐個構建。當然,您也可以爲target1指定一個命令。該命令將在其相關性$(program_C_OBJS)建立後立即執行。