2017-10-18 141 views
1

我有3個文件:node.h,node.c和main.c中 如果生成文件是自動生成文件生成命令

CFLAGS += -std=c99 -g -Wall 
run: node 
    ./node 

node: node.o main.o 

然後,當我運行make,這些命令運行

cc -std=c99 -g -Wall -c -o node.o node.c 
cc -std=c99 -g -Wall -c -o main.o main.c 
cc node.o main.o -o node 
./node 

我想生成了前兩行,因爲

  • 首先,make嘗試運行node但它找不到node
  • 因此,make持有run並進入到下一個目標,也就是在node線4
  • 然後,make看到依賴node.omain.o。在這個時候,它知道必須創建目標文件node.omain.o

不過,我不明白爲什麼會產生

cc node.o main.o -o node 

第三命令在試圖探索這個謎,我觀察到如果在node線2被改變爲node1,會發生

CFLAGS += -std=c99 -g -Wall 
run: node1 
    ./node1 

node1: node.o main.o 

回答

1

https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue-of-Rules一個錯誤:

鏈接一個對象文件

n被自動從n.o通過運行經由C編譯器接頭(通常稱爲LD)製成。使用的精確配方是'$(CC)$(LDFLAGS)n.o $(LOADLIBES)$(LDLIBS)'。

這條規則對於只有一個源文件的簡單程序來說是正確的。如果有多個目標文件(可能來自各種其他源文件),它也會做正確的事情,其中​​一個文件的名稱與可執行文件的名稱相匹配。

當您從節點變更爲node1,也不再是node1.c(因此沒有隱含node1.o,因此隱含規則不適用)。

+0

不錯。我的直覺告訴我必須有一些隱含的規則,但我找不到文件。謝謝。 – cuongptnk